mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-20 09:07:52 +01:00

This change integrates fuzzing support for RtpDumps in WebRTC. This allows LibFuzzer to directly fuzz the RTP code path from packet arrival all the way to actual decoding and rendering. It does this by replaying each RTP packet in the RTPDump which can be mutated directly by the fuzzer. For fuzzing support the RtpFileReader needs to support reading from a buffer instead of an file. The test class requires FILE* for all its parsing operations and is deeply coupled this way. I chose to solve this problem at an OS level by using the tmpfile() option and copying the buffer to the tmpfile(). fmemopen() is no available on most platforms so couldn't be used as a generic solution. The additional copy isn't ideal but won't be a bottleneck for the fuzzing. In the future I plan for the fuzzers to read from a configuration file. But given the current packaging strategy for fuzzers in WebRTC this isn't easy. Bug: webrtc:9860 Change-Id: I2560120e82663f9e9fb5b9640e6a6d16f9c1a360 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/126682 Reviewed-by: Niels Moller <nisse@webrtc.org> Commit-Queue: Benjamin Wright <benwright@webrtc.org> Cr-Commit-Position: refs/heads/master@{#27151}
42 lines
1.4 KiB
C++
42 lines
1.4 KiB
C++
/*
|
|
* Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
#include "absl/memory/memory.h"
|
|
#include "test/fuzzers/utils/rtp_replayer.h"
|
|
|
|
namespace webrtc {
|
|
|
|
void FuzzOneInput(const uint8_t* data, size_t size) {
|
|
auto stream_state = absl::make_unique<test::RtpReplayer::StreamState>();
|
|
VideoReceiveStream::Config vp9_config(&(stream_state->transport));
|
|
|
|
VideoReceiveStream::Decoder vp9_decoder;
|
|
vp9_decoder.video_format = SdpVideoFormat("VP9");
|
|
vp9_decoder.payload_type = 124;
|
|
vp9_config.decoders.push_back(std::move(vp9_decoder));
|
|
|
|
vp9_config.rtp.local_ssrc = 7731;
|
|
vp9_config.rtp.remote_ssrc = 1337;
|
|
vp9_config.rtp.rtx_ssrc = 100;
|
|
vp9_config.rtp.transport_cc = true;
|
|
vp9_config.rtp.remb = true;
|
|
vp9_config.rtp.nack.rtp_history_ms = 1000;
|
|
|
|
std::vector<VideoReceiveStream::Config> replay_configs;
|
|
replay_configs.push_back(std::move(vp9_config));
|
|
|
|
test::RtpReplayer::Replay(std::move(stream_state), std::move(replay_configs),
|
|
data, size);
|
|
}
|
|
|
|
} // namespace webrtc
|