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}
This commit is contained in:
philipel
2018-05-17 16:44:47 +02:00
committed by Commit Bot
parent f2fae875d5
commit 0c87e293c9
3 changed files with 31 additions and 32 deletions

View File

@ -23,10 +23,23 @@ rtc_static_library("webrtc_fuzzer_main") {
] ]
} }
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") { template("webrtc_fuzzer_test") {
fuzzer_test(target_name) { fuzzer_test(target_name) {
forward_variables_from(invoker, "*") forward_variables_from(invoker, "*")
deps += [ deps += [
":fuzz_data_helper",
":webrtc_fuzzer_main", ":webrtc_fuzzer_main",
# Link unconditionally with webrtc's TaskQueue, regardless of # Link unconditionally with webrtc's TaskQueue, regardless of
@ -189,7 +202,7 @@ webrtc_fuzzer_test("packet_buffer_fuzzer") {
"../../modules/video_coding/", "../../modules/video_coding/",
"../../system_wrappers", "../../system_wrappers",
] ]
libfuzzer_options = [ "max_len=2000" ] libfuzzer_options = [ "max_len=200000" ]
} }
webrtc_fuzzer_test("rtcp_receiver_fuzzer") { webrtc_fuzzer_test("rtcp_receiver_fuzzer") {
@ -320,7 +333,6 @@ webrtc_fuzzer_test("audio_encoder_opus_fuzzer") {
"audio_encoder_opus_fuzzer.cc", "audio_encoder_opus_fuzzer.cc",
] ]
deps = [ deps = [
":fuzz_data_helper",
"../../api:array_view", "../../api:array_view",
"../../api/audio_codecs/opus:audio_encoder_opus", "../../api/audio_codecs/opus:audio_encoder_opus",
"../../rtc_base:checks", "../../rtc_base:checks",
@ -359,7 +371,6 @@ webrtc_fuzzer_test("neteq_signal_fuzzer") {
"neteq_signal_fuzzer.cc", "neteq_signal_fuzzer.cc",
] ]
deps = [ deps = [
":fuzz_data_helper",
"../../api:array_view", "../../api:array_view",
"../../modules/audio_coding:neteq", "../../modules/audio_coding:neteq",
"../../modules/audio_coding:neteq_test_tools", "../../modules/audio_coding:neteq_test_tools",
@ -457,7 +468,6 @@ webrtc_fuzzer_test("audio_processing_fuzzer") {
] ]
deps = [ deps = [
":audio_processing_fuzzer_helper", ":audio_processing_fuzzer_helper",
":fuzz_data_helper",
"../../api/audio:aec3_factory", "../../api/audio:aec3_factory",
"../../modules/audio_processing", "../../modules/audio_processing",
"../../modules/audio_processing/aec3", "../../modules/audio_processing/aec3",
@ -472,25 +482,12 @@ webrtc_fuzzer_test("comfort_noise_decoder_fuzzer") {
"comfort_noise_decoder_fuzzer.cc", "comfort_noise_decoder_fuzzer.cc",
] ]
deps = [ deps = [
":fuzz_data_helper",
"../../api:array_view", "../../api:array_view",
"../../modules/audio_coding:cng", "../../modules/audio_coding:cng",
"../../rtc_base:rtc_base_approved", "../../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") { webrtc_fuzzer_test("rtp_frame_reference_finder_fuzzer") {
sources = [ sources = [
"rtp_frame_reference_finder_fuzzer.cc", "rtp_frame_reference_finder_fuzzer.cc",

View File

@ -79,8 +79,21 @@ class FuzzDataHelper {
return data_.subview(index_to_return, bytes); 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 BytesRead() const { return data_ix_; }
size_t BytesLeft() const { return data_.size() - data_ix_; };
private: private:
rtc::ArrayView<const uint8_t> data_; rtc::ArrayView<const uint8_t> data_;
size_t data_ix_ = 0; size_t data_ix_ = 0;

View File

@ -10,9 +10,9 @@
#include "modules/video_coding/packet_buffer.h" #include "modules/video_coding/packet_buffer.h"
#include "system_wrappers/include/clock.h" #include "system_wrappers/include/clock.h"
#include "test/fuzzers/fuzz_data_helper.h"
namespace webrtc { namespace webrtc {
namespace { namespace {
class NullCallback : public video_coding::OnReceivedFrameCallback { class NullCallback : public video_coding::OnReceivedFrameCallback {
void OnReceivedFrame(std::unique_ptr<video_coding::RtpFrameObject> frame) {} void OnReceivedFrame(std::unique_ptr<video_coding::RtpFrameObject> frame) {}
@ -20,27 +20,16 @@ class NullCallback : public video_coding::OnReceivedFrameCallback {
} // namespace } // namespace
void FuzzOneInput(const uint8_t* data, size_t size) { 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; VCMPacket packet;
NullCallback callback; NullCallback callback;
SimulatedClock clock(0); SimulatedClock clock(0);
rtc::scoped_refptr<video_coding::PacketBuffer> packet_buffer( rtc::scoped_refptr<video_coding::PacketBuffer> packet_buffer(
video_coding::PacketBuffer::Create(&clock, 8, 1024, &callback)); video_coding::PacketBuffer::Create(&clock, 8, 1024, &callback));
test::FuzzDataHelper helper(rtc::ArrayView<const uint8_t>(data, size));
size_t i = kMinDataNeeded; while (helper.BytesLeft())
while (i < size) { helper.CopyTo(&packet);
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;
}
} }
} // namespace webrtc } // namespace webrtc