Update packet_buffer_fuzzer to fuzz full packets.

Bug: webrtc:7728
Change-Id: I9d33404470c2ecf8d6f91c57c9dc9fd4dd821a18
Reviewed-on: https://webrtc-review.googlesource.com/77424
Commit-Queue: Philip Eliasson <philipel@webrtc.org>
Reviewed-by: Alex Loiko <aleloi@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#23485}
diff --git a/test/fuzzers/BUILD.gn b/test/fuzzers/BUILD.gn
index 27a7425..6375dc3 100644
--- a/test/fuzzers/BUILD.gn
+++ b/test/fuzzers/BUILD.gn
@@ -23,10 +23,23 @@
   ]
 }
 
+rtc_static_library("fuzz_data_helper") {
+  sources = [
+    "fuzz_data_helper.cc",
+    "fuzz_data_helper.h",
+  ]
+  deps = [
+    "../../api:array_view",
+    "../../modules/rtp_rtcp:rtp_rtcp_format",
+  ]
+  visibility = [ ":*" ]  # Only targets in this file can depend on this.
+}
+
 template("webrtc_fuzzer_test") {
   fuzzer_test(target_name) {
     forward_variables_from(invoker, "*")
     deps += [
+      ":fuzz_data_helper",
       ":webrtc_fuzzer_main",
 
       # Link unconditionally with webrtc's TaskQueue, regardless of
@@ -189,7 +202,7 @@
     "../../modules/video_coding/",
     "../../system_wrappers",
   ]
-  libfuzzer_options = [ "max_len=2000" ]
+  libfuzzer_options = [ "max_len=200000" ]
 }
 
 webrtc_fuzzer_test("rtcp_receiver_fuzzer") {
@@ -320,7 +333,6 @@
     "audio_encoder_opus_fuzzer.cc",
   ]
   deps = [
-    ":fuzz_data_helper",
     "../../api:array_view",
     "../../api/audio_codecs/opus:audio_encoder_opus",
     "../../rtc_base:checks",
@@ -359,7 +371,6 @@
     "neteq_signal_fuzzer.cc",
   ]
   deps = [
-    ":fuzz_data_helper",
     "../../api:array_view",
     "../../modules/audio_coding:neteq",
     "../../modules/audio_coding:neteq_test_tools",
@@ -457,7 +468,6 @@
   ]
   deps = [
     ":audio_processing_fuzzer_helper",
-    ":fuzz_data_helper",
     "../../api/audio:aec3_factory",
     "../../modules/audio_processing",
     "../../modules/audio_processing/aec3",
@@ -472,25 +482,12 @@
     "comfort_noise_decoder_fuzzer.cc",
   ]
   deps = [
-    ":fuzz_data_helper",
     "../../api:array_view",
     "../../modules/audio_coding:cng",
     "../../rtc_base:rtc_base_approved",
   ]
 }
 
-rtc_static_library("fuzz_data_helper") {
-  sources = [
-    "fuzz_data_helper.cc",
-    "fuzz_data_helper.h",
-  ]
-  deps = [
-    "../../api:array_view",
-    "../../modules/rtp_rtcp:rtp_rtcp_format",
-  ]
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-}
-
 webrtc_fuzzer_test("rtp_frame_reference_finder_fuzzer") {
   sources = [
     "rtp_frame_reference_finder_fuzzer.cc",
diff --git a/test/fuzzers/fuzz_data_helper.h b/test/fuzzers/fuzz_data_helper.h
index b5b916f..4606de1 100644
--- a/test/fuzzers/fuzz_data_helper.h
+++ b/test/fuzzers/fuzz_data_helper.h
@@ -79,8 +79,21 @@
     return data_.subview(index_to_return, bytes);
   }
 
+  // If sizeof(T) > BytesLeft then the remaining bytes will be used and the rest
+  // of the object will be zero initialized.
+  template <typename T>
+  void CopyTo(T* object) {
+    memset(object, 0, sizeof(T));
+
+    size_t bytes_to_copy = std::min(BytesLeft(), sizeof(T));
+    memcpy(object, data_.data() + data_ix_, bytes_to_copy);
+    data_ix_ += bytes_to_copy;
+  }
+
   size_t BytesRead() const { return data_ix_; }
 
+  size_t BytesLeft() const { return data_.size() - data_ix_; };
+
  private:
   rtc::ArrayView<const uint8_t> data_;
   size_t data_ix_ = 0;
diff --git a/test/fuzzers/packet_buffer_fuzzer.cc b/test/fuzzers/packet_buffer_fuzzer.cc
index df6baf4..7f116f6 100644
--- a/test/fuzzers/packet_buffer_fuzzer.cc
+++ b/test/fuzzers/packet_buffer_fuzzer.cc
@@ -10,9 +10,9 @@
 
 #include "modules/video_coding/packet_buffer.h"
 #include "system_wrappers/include/clock.h"
+#include "test/fuzzers/fuzz_data_helper.h"
 
 namespace webrtc {
-
 namespace {
 class NullCallback : public video_coding::OnReceivedFrameCallback {
   void OnReceivedFrame(std::unique_ptr<video_coding::RtpFrameObject> frame) {}
@@ -20,27 +20,16 @@
 }  // namespace
 
 void FuzzOneInput(const uint8_t* data, size_t size) {
-  // Two bytes for the sequence number,
-  // one byte for |is_first_packet_in_frame| and |markerBit|.
-  constexpr size_t kMinDataNeeded = 3;
-  if (size < kMinDataNeeded) {
-    return;
-  }
 
   VCMPacket packet;
   NullCallback callback;
   SimulatedClock clock(0);
   rtc::scoped_refptr<video_coding::PacketBuffer> packet_buffer(
       video_coding::PacketBuffer::Create(&clock, 8, 1024, &callback));
+  test::FuzzDataHelper helper(rtc::ArrayView<const uint8_t>(data, size));
 
-  size_t i = kMinDataNeeded;
-  while (i < size) {
-    memcpy(&packet.seqNum, &data[i - kMinDataNeeded], 2);
-    packet.is_first_packet_in_frame = data[i] & 1;
-    packet.markerBit = data[i] & 2;
-    packet_buffer->InsertPacket(&packet);
-    i += kMinDataNeeded;
-  }
+  while (helper.BytesLeft())
+    helper.CopyTo(&packet);
 }
 
 }  // namespace webrtc