release-request-d9dc98f7-19b2-484c-b4d1-f35dc43e9c05-for-git_oc-mr1-release-4152006 snap-temp-L91700000079405440

Change-Id: Ib82284d0a9202a72569266cd9296a0a1c0ff2060
diff --git a/iface_fuzzer/ProtoFuzzerMain.cpp b/iface_fuzzer/ProtoFuzzerMain.cpp
index 59ec328..6b79192 100644
--- a/iface_fuzzer/ProtoFuzzerMain.cpp
+++ b/iface_fuzzer/ProtoFuzzerMain.cpp
@@ -83,14 +83,13 @@
 extern "C" size_t LLVMFuzzerCustomMutator(uint8_t *data, size_t size,
                                           size_t max_size, unsigned int seed) {
   ExecSpec exec_spec{};
-  if (!exec_spec.ParseFromArray(data, size)) {
+  if (!FromArray(data, size, &exec_spec)) {
     exec_spec =
         mutator->RandomGen(runner->GetOpenedIfaces(), params.exec_size_);
   } else {
     mutator->Mutate(runner->GetOpenedIfaces(), &exec_spec);
   }
-  exec_spec.SerializeToArray(data, exec_spec.ByteSize());
-  return exec_spec.ByteSize();
+  return ToArray(data, size, &exec_spec);
 }
 
 // TODO(trong): implement a meaningful cross-over mechanism.
@@ -103,9 +102,9 @@
 }
 
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
-  ExecSpec exec_spec;
-  if (!exec_spec.ParseFromArray(data, size) ||
-      exec_spec.function_call_size() == 0) {
+  ExecSpec exec_spec{};
+  if (!FromArray(data, size, &exec_spec)) {
+    cerr << "Failed to deserialize an ExecSpec." << endl;
     return 0;
   }
   runner->Execute(exec_spec);
diff --git a/iface_fuzzer/ProtoFuzzerUtils.cpp b/iface_fuzzer/ProtoFuzzerUtils.cpp
index b6c2231..6dbdb0a 100644
--- a/iface_fuzzer/ProtoFuzzerUtils.cpp
+++ b/iface_fuzzer/ProtoFuzzerUtils.cpp
@@ -155,6 +155,19 @@
   return predefined_types;
 }
 
+bool FromArray(const uint8_t *data, size_t size, ExecSpec *exec_spec) {
+  // TODO(b/63136690): Use checksum to validate exec_spec more reliably.
+  return exec_spec->ParseFromArray(data, size) && exec_spec->has_valid() &&
+         exec_spec->valid();
+}
+
+size_t ToArray(uint8_t *data, size_t size, ExecSpec *exec_spec) {
+  exec_spec->set_valid(true);
+  size_t exec_size = exec_spec->ByteSize();
+  exec_spec->SerializeToArray(data, exec_size);
+  return exec_size;
+}
+
 }  // namespace fuzzer
 }  // namespace vts
 }  // namespace android
diff --git a/iface_fuzzer/include/ProtoFuzzerUtils.h b/iface_fuzzer/include/ProtoFuzzerUtils.h
index 753a2be..85af37f 100644
--- a/iface_fuzzer/include/ProtoFuzzerUtils.h
+++ b/iface_fuzzer/include/ProtoFuzzerUtils.h
@@ -88,6 +88,13 @@
 std::unordered_map<std::string, TypeSpec> ExtractPredefinedTypes(
     const std::vector<CompSpec> &);
 
+// Serializes ExecSpec into byte form and writes it to buffer. Returns number of
+// written bytes.
+size_t ToArray(uint8_t *, size_t, ExecSpec *);
+
+// Deserializes given buffer to an ExecSpec. Returns true on success.
+bool FromArray(const uint8_t *, size_t, ExecSpec *);
+
 }  // namespace fuzzer
 }  // namespace vts
 }  // namespace android