Fix crash when attempting to parse a JSON document that contains an extension field for the wrong type of message.

I.e., if foo.extn is an extension for message foo.Foo, attempting to parse the document

  {"[foo.extn]": 4}

as a foo.Bar would crash. This CL causes the parser to return an error instead.

PiperOrigin-RevId: 501299336
pull/11472/head
Protobuf Team Bot 2 years ago committed by Copybara-Service
parent d36a64116f
commit 9244d121b4
  1. 8
      src/google/protobuf/json/internal/parser.cc
  2. 5
      src/google/protobuf/json/json_test.cc

@ -1181,6 +1181,14 @@ absl::Status ParseField(JsonLexer& lex, const Desc<Traits>& desc,
if (absl::StartsWith(name, "[") && absl::EndsWith(name, "]")) {
absl::string_view extn_name = name.substr(1, name.size() - 2);
field = Traits::ExtensionByName(desc, extn_name);
auto correct_type_name = Traits::TypeName(desc);
if (Traits::TypeName(Traits::ContainingType(*field)) != correct_type_name) {
return lex.Invalid(absl::StrFormat(
"'%s' is a known extension name, but is not an extenion "
"of '%s' as expected",
extn_name, correct_type_name));
}
} else {
field = Traits::FieldByName(desc, name);
}

@ -1042,6 +1042,11 @@ TEST_P(JsonTest, Extensions) {
R"("[protobuf_unittest.TestMixedFieldsAndExtensions.c]":42,)"
R"("b":[1,2,3],)"
R"("[protobuf_unittest.TestMixedFieldsAndExtensions.d]":[1,1,2,3,5,8,13]})"));
auto m2 = ToProto<protobuf_unittest::TestAllTypes>(R"json({
"[protobuf_unittest.TestMixedFieldsAndExtensions.c]": 42
})json");
EXPECT_THAT(m2, StatusIs(absl::StatusCode::kInvalidArgument));
}
// Parsing does NOT work like MergeFrom: existing repeated field values are

Loading…
Cancel
Save