Chromium Code Reviews| Index: base/json/json_parser_unittest.cc |
| diff --git a/base/json/json_parser_unittest.cc b/base/json/json_parser_unittest.cc |
| index e3f635b76f1361f3c1bb8db00ffa5d20b0410d4a..783e3c772f70937f22d82ca09bb64515630e2334 100644 |
| --- a/base/json/json_parser_unittest.cc |
| +++ b/base/json/json_parser_unittest.cc |
| @@ -28,6 +28,17 @@ class JSONParserTest : public testing::Test { |
| return parser; |
| } |
| + // MSan will do a better job detecting over-read errors if the input is |
| + // not nul-terminated on the heap. This will copy |input| to a new buffer |
| + // owned by |owner|, returning a StringPiece to |owner|. |
| + StringPiece MakeNullTerminatedInput(const char* input, |
|
jdoerrie
2017/05/05 09:34:11
nit: MakeNonNullTerminatedInput
Robert Sesek
2017/05/05 21:20:50
Done.
|
| + std::unique_ptr<char[]>* owner) { |
| + size_t str_len = strlen(input); |
| + owner->reset(new char[str_len]); |
| + memcpy(owner->get(), input, str_len); |
| + return StringPiece(owner->get(), str_len); |
| + } |
| + |
| void TestLastThree(JSONParser* parser) { |
| EXPECT_EQ(',', *parser->NextChar()); |
| EXPECT_EQ('|', *parser->NextChar()); |
| @@ -367,14 +378,10 @@ TEST_F(JSONParserTest, ParseNumberErrors) { |
| auto test_case = kCases[i]; |
| SCOPED_TRACE(StringPrintf("case %u: \"%s\"", i, test_case.input)); |
| - // MSan will do a better job detecting over-read errors if the input is |
| - // not nul-terminated on the heap. |
| - size_t str_len = strlen(test_case.input); |
| - auto non_nul_termianted = MakeUnique<char[]>(str_len); |
| - memcpy(non_nul_termianted.get(), test_case.input, str_len); |
| + std::unique_ptr<char[]> input_owner; |
| + StringPiece input = MakeNullTerminatedInput(test_case.input, &input_owner); |
| - StringPiece string_piece(non_nul_termianted.get(), str_len); |
| - std::unique_ptr<Value> result = JSONReader::Read(string_piece); |
| + std::unique_ptr<Value> result = JSONReader::Read(input); |
| if (test_case.parse_success) { |
| EXPECT_TRUE(result); |
| } else { |
| @@ -390,5 +397,29 @@ TEST_F(JSONParserTest, ParseNumberErrors) { |
| } |
| } |
| +TEST_F(JSONParserTest, UnterminatedInputs) { |
| + const char* kCases[] = { |
| + // clang-format off |
| + "/", |
| + "//", |
| + "/*", |
| + "\"xxxxxx", |
| + "\"", |
| + "{ ", |
| + "[\t", |
| + // clang-format on |
| + }; |
| + |
| + for (unsigned int i = 0; i < arraysize(kCases); ++i) { |
| + auto* test_case = kCases[i]; |
| + SCOPED_TRACE(StringPrintf("case %u: \"%s\"", i, test_case)); |
| + |
| + std::unique_ptr<char[]> input_owner; |
| + StringPiece input = MakeNullTerminatedInput(test_case, &input_owner); |
| + |
| + EXPECT_FALSE(JSONReader::Read(input)); |
| + } |
| +} |
| + |
| } // namespace internal |
| } // namespace base |