Commit 33a3143c authored by Michal 'vorner' Vaner's avatar Michal 'vorner' Vaner
Browse files

[2375] Check we don't read past the end

parent a48d74bc
......@@ -157,7 +157,8 @@ MasterLexer::getNextToken(Options options) {
// Reset the token now. This is to check a token was actually produced.
// This is debugging aid.
impl_->token_ = Token(Token::NO_TOKEN_PRODUCED);
if (impl_->source_ == NULL) {
// If the source is not available
if (impl_->source_ == NULL || impl_->source_->atEOF()) {
isc_throw(isc::InvalidOperation, "No source to read tokens from");
}
for (const State *state = start(options); state != NULL;
......@@ -187,7 +188,7 @@ const char* const error_text[] = {
"unbalanced parentheses", // UNBALANCED_PAREN
"unexpected end of input", // UNEXPECTED_END
"unbalanced quotes", // UNBALANCED_QUOTES
"no token produced"
"no token produced" // NO_TOKEN_PRODUCED
};
const size_t error_text_max_count = sizeof(error_text) / sizeof(error_text[0]);
}
......
......@@ -257,4 +257,16 @@ TEST_F(MasterLexerTest, realStart) {
lexer.getNextToken(MasterLexer::INITIAL_WS).getType());
}
// Test we correctly find end of file. Then, upon more attempts to produce
// tokens past the end, it throws.
TEST_F(MasterLexerTest, eof) {
// Let the ss empty.
lexer.pushSource(ss);
// The first one is found to be EOF
EXPECT_EQ(MasterLexer::Token::END_OF_FILE, lexer.getNextToken().getType());
// And it is not allowed to use this one any more.
EXPECT_THROW(lexer.getNextToken(), isc::InvalidOperation);
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment