Handle bad input with a ParseException not an assert() (Fixes CVE-2017-11692)
This commit is contained in:
parent
587b24e2ee
commit
cee1ec92b3
@ -52,6 +52,7 @@ const char* const INVALID_HEX = "bad character found while scanning hex number";
|
|||||||
const char* const INVALID_UNICODE = "invalid unicode: ";
|
const char* const INVALID_UNICODE = "invalid unicode: ";
|
||||||
const char* const INVALID_ESCAPE = "unknown escape character: ";
|
const char* const INVALID_ESCAPE = "unknown escape character: ";
|
||||||
const char* const UNKNOWN_TOKEN = "unknown token";
|
const char* const UNKNOWN_TOKEN = "unknown token";
|
||||||
|
const char* const NO_MORE_TOKENS = "no more tokens to be read";
|
||||||
const char* const DOC_IN_SCALAR = "illegal document indicator in scalar";
|
const char* const DOC_IN_SCALAR = "illegal document indicator in scalar";
|
||||||
const char* const EOF_IN_SCALAR = "illegal EOF in scalar";
|
const char* const EOF_IN_SCALAR = "illegal EOF in scalar";
|
||||||
const char* const CHAR_IN_SCALAR = "illegal character in scalar";
|
const char* const CHAR_IN_SCALAR = "illegal character in scalar";
|
||||||
|
|||||||
@ -34,9 +34,10 @@ void Scanner::pop() {
|
|||||||
|
|
||||||
Token& Scanner::peek() {
|
Token& Scanner::peek() {
|
||||||
EnsureTokensInQueue();
|
EnsureTokensInQueue();
|
||||||
assert(!m_tokens.empty()); // should we be asserting here? I mean, we really
|
|
||||||
// just be checking
|
// If there are no more tokens, we cannon fulfil our post-condition
|
||||||
// if it's empty before peeking.
|
if (m_tokens.empty())
|
||||||
|
throw ParserException(INPUT.mark(), ErrorMsg::NO_MORE_TOKENS);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
static Token *pLast = 0;
|
static Token *pLast = 0;
|
||||||
|
|||||||
@ -1,9 +1,11 @@
|
|||||||
#include "yaml-cpp/parser.h"
|
#include "yaml-cpp/parser.h"
|
||||||
|
#include "yaml-cpp/exceptions.h"
|
||||||
#include "mock_event_handler.h"
|
#include "mock_event_handler.h"
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
using YAML::Parser;
|
using YAML::Parser;
|
||||||
using YAML::MockEventHandler;
|
using YAML::MockEventHandler;
|
||||||
|
using ::testing::NiceMock;
|
||||||
using ::testing::StrictMock;
|
using ::testing::StrictMock;
|
||||||
|
|
||||||
TEST(ParserTest, Empty) {
|
TEST(ParserTest, Empty) {
|
||||||
@ -14,3 +16,11 @@ TEST(ParserTest, Empty) {
|
|||||||
StrictMock<MockEventHandler> handler;
|
StrictMock<MockEventHandler> handler;
|
||||||
EXPECT_FALSE(parser.HandleNextDocument(handler));
|
EXPECT_FALSE(parser.HandleNextDocument(handler));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(ParserTest, CVE_2017_11692) {
|
||||||
|
std::istringstream input{"!2"};
|
||||||
|
Parser parser{input};
|
||||||
|
|
||||||
|
NiceMock<MockEventHandler> handler;
|
||||||
|
EXPECT_THROW(parser.HandleNextDocument(handler), YAML::ParserException);
|
||||||
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user