From 33a3143ca00c21437081918f38da6d3c2370330b Mon Sep 17 00:00:00 2001 From: Michal 'vorner' Vaner Date: Tue, 13 Nov 2012 19:18:20 +0100 Subject: [PATCH] [2375] Check we don't read past the end --- src/lib/dns/master_lexer.cc | 5 +++-- src/lib/dns/tests/master_lexer_unittest.cc | 12 ++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) 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); +} + } -- 2.47.3