Avoid OOM during input prasing by limiting the object size reservation.

PiperOrigin-RevId: 624202250
diff --git a/fuzztest/internal/serialization.cc b/fuzztest/internal/serialization.cc
index e6c50ae..fe4fae7 100644
--- a/fuzztest/internal/serialization.cc
+++ b/fuzztest/internal/serialization.cc
@@ -285,6 +285,8 @@
       uint64_t vec_size;
       std::memcpy(&vec_size, buf.str, sizeof(vec_size));
       buf.Advance(sizeof(vec_size));
+      // This could happen for malformed inputs.
+      if (vec_size > buf.size) return false;
       auto& v = obj.value.emplace<std::vector<IRObject>>();
       v.reserve(vec_size);
       for (uint64_t i = 0; i < vec_size; ++i) {
diff --git a/fuzztest/internal/serialization_test.cc b/fuzztest/internal/serialization_test.cc
index 17e7da8..c84da1d 100644
--- a/fuzztest/internal/serialization_test.cc
+++ b/fuzztest/internal/serialization_test.cc
@@ -325,6 +325,18 @@
               Optional(SubsAre(ValueIs<uint64_t>(0))));
 }
 
+TEST(BinaryFormatSerializerTest, MalformedObjectSizeIsRejectedWithoutOOM) {
+  static constexpr char kGoodInput[] =
+      "FUZZTESTv1b\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00";
+  static constexpr char kBadInput[] =
+      "FUZZTESTv1b\x04\xff\xff\xff\xff\xff\xff\xff\xff\x00";
+  EXPECT_THAT(IRObject::FromString({kGoodInput, sizeof(kGoodInput) - 1}),
+              Optional(SubsAre(ValueIs<std::monostate>({}))));
+  // Expect grace failure instead of OOM error.
+  EXPECT_EQ(IRObject::FromString({kBadInput, sizeof(kBadInput) - 1}),
+            std::nullopt);
+}
+
 TEST(IRToCorpus, SpecializationIsBackwardCompatible) {
   EXPECT_THAT(
       (IRObject{std::vector<IRObject>{IRObject{1}, IRObject{2}, IRObject{3}}}