From: Michal 'vorner' Vaner Date: Tue, 13 Nov 2012 18:18:20 +0000 (+0100) Subject: [2375] Check we don't read past the end X-Git-Tag: bind10-1.0.0-beta-release~84^2~3^2~21 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=33a3143;p=thirdparty%2Fkea.git [2375] Check we don't read past the end --- diff --git a/src/lib/dns/master_lexer.cc b/src/lib/dns/master_lexer.cc index 5567833560..4b02bc0f4a 100644 --- a/src/lib/dns/master_lexer.cc +++ b/src/lib/dns/master_lexer.cc @@ -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]); } diff --git a/src/lib/dns/tests/master_lexer_unittest.cc b/src/lib/dns/tests/master_lexer_unittest.cc index 52bc425c36..a36d0a8679 100644 --- a/src/lib/dns/tests/master_lexer_unittest.cc +++ b/src/lib/dns/tests/master_lexer_unittest.cc @@ -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); +} + }