Avoid reading uninitialized memory when validating MiniTable.
PiperOrigin-RevId: 506163723
diff --git a/upb/message/test.cc b/upb/message/test.cc
index cd372a0..f0e392d 100644
--- a/upb/message/test.cc
+++ b/upb/message/test.cc
@@ -655,4 +655,8 @@
// 0);
// }
//
+// TEST(FuzzTest, MapFieldVerify) {
+// DecodeEncodeArbitrarySchemaAndPayload({{"% ^!"}, {}, "", {}}, "", 0, 0);
+// }
+//
// end:google_only
diff --git a/upb/mini_table/decode.c b/upb/mini_table/decode.c
index 3c72c5b..4c4c5be 100644
--- a/upb/mini_table/decode.c
+++ b/upb/mini_table/decode.c
@@ -675,7 +675,7 @@
name, expected_num, (int)f->number);
}
- if (upb_IsRepeatedOrMap(f) || f->presence < 0) {
+ if (upb_IsRepeatedOrMap(f)) {
upb_MtDecoder_ErrorFormat(
d, "map %s cannot be repeated or map, or be in oneof", name);
}
@@ -705,6 +705,13 @@
UPB_UNREACHABLE();
}
+ upb_LayoutItem* end = UPB_PTRADD(d->vec.data, d->vec.size);
+ for (upb_LayoutItem* item = d->vec.data; item < end; item++) {
+ if (item->type == kUpb_LayoutItemType_OneofCase) {
+ upb_MtDecoder_ErrorFormat(d, "Map entry cannot have oneof");
+ }
+ }
+
upb_MtDecoder_ValidateEntryField(d, &d->table->fields[0], 1);
upb_MtDecoder_ValidateEntryField(d, &d->table->fields[1], 2);