Commit 5b644f62 authored by Abhishek Arya's avatar Abhishek Arya Committed by Commit Bot

Deprecate fuzzing helpers in favor templated ConsumeIntegralInRange.

R=mmoroz@chromium.org,rch@chromium.org,enne@chromium.org,ajwong@chromium.org,jschin@chromium.org
TBR=tkent@chromium.org

Bug: 907103
Change-Id: Ib93a393e35650233f3c77e32080af048f9b301fb
Reviewed-on: https://chromium-review.googlesource.com/c/1351483
Commit-Queue: Abhishek Arya <inferno@chromium.org>
Reviewed-by: default avatarRia Jiang <riajiang@chromium.org>
Reviewed-by: default avatarKent Tamura <tkent@chromium.org>
Reviewed-by: default avatarRyan Hamilton <rch@chromium.org>
Reviewed-by: default avatarenne <enne@chromium.org>
Reviewed-by: default avatarMax Moroz <mmoroz@chromium.org>
Reviewed-by: default avatarJungshik Shin <jshin@chromium.org>
Reviewed-by: default avatarAlbert J. Wong <ajwong@chromium.org>
Cr-Commit-Position: refs/heads/master@{#611469}
parent 75ece174
...@@ -102,7 +102,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { ...@@ -102,7 +102,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
} }
case 14: { case 14: {
const char* data_result = nullptr; const char* data_result = nullptr;
int read_length = data_provider.ConsumeInt32InRange(0, kMaxReadLength); int read_length =
data_provider.ConsumeIntegralInRange(0, kMaxReadLength);
ignore_result(iter.ReadBytes(&data_result, read_length)); ignore_result(iter.ReadBytes(&data_result, read_length));
break; break;
} }
...@@ -113,7 +114,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { ...@@ -113,7 +114,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
} }
case 16: { case 16: {
ignore_result(iter.SkipBytes( ignore_result(iter.SkipBytes(
data_provider.ConsumeInt32InRange(0, kMaxSkipBytes))); data_provider.ConsumeIntegralInRange(0, kMaxSkipBytes)));
break; break;
} }
} }
......
...@@ -151,24 +151,11 @@ class FuzzedDataProvider { ...@@ -151,24 +151,11 @@ class FuzzedDataProvider {
return ConsumeBytesAsString(remaining_bytes_); return ConsumeBytesAsString(remaining_bytes_);
} }
// TODO(mmoroz): consider deprecating these methods.
uint32_t ConsumeUint32InRange(uint32_t min, uint32_t max) {
return ConsumeIntegralInRange(min, max);
}
int32_t ConsumeInt32InRange(int32_t min, int32_t max) {
return ConsumeIntegralInRange(min, max);
}
int ConsumeIntInRange(int min, int max) {
return ConsumeIntegralInRange(min, max);
}
// Reads one byte and returns a bool, or false when no data remains. // Reads one byte and returns a bool, or false when no data remains.
bool ConsumeBool() { return 1 & ConsumeUint8(); } bool ConsumeBool() { return 1 & ConsumeUint8(); }
// Returns a uint8_t from the input or 0 if nothing remains. This is // Returns a uint8_t from the input or 0 if nothing remains. This is
// equivalent to ConsumeUint32InRange(0, 0xFF). // equivalent to ConsumeIntegralInRange<uint8_t>(0, 0xFF).
uint8_t ConsumeUint8() { uint8_t ConsumeUint8() {
return ConsumeIntegralInRange(std::numeric_limits<uint8_t>::min(), return ConsumeIntegralInRange(std::numeric_limits<uint8_t>::min(),
std::numeric_limits<uint8_t>::max()); std::numeric_limits<uint8_t>::max());
...@@ -176,16 +163,32 @@ class FuzzedDataProvider { ...@@ -176,16 +163,32 @@ class FuzzedDataProvider {
// Returns a uint16_t from the input. If fewer than 2 bytes of data remain // Returns a uint16_t from the input. If fewer than 2 bytes of data remain
// will fill the most significant bytes with 0. This is equivalent to // will fill the most significant bytes with 0. This is equivalent to
// ConsumeUint32InRange(0, 0xFFFF). // ConsumeIntegralInRange<uint16_t>(0, 0xFFFF).
uint16_t ConsumeUint16() { uint16_t ConsumeUint16() {
return ConsumeIntegralInRange(std::numeric_limits<uint16_t>::min(), return ConsumeIntegralInRange(std::numeric_limits<uint16_t>::min(),
std::numeric_limits<uint16_t>::max()); std::numeric_limits<uint16_t>::max());
} }
// Returns a uint32_t from the input. If fewer than 4 bytes of data remain
// will fill the most significant bytes with 0. This is equivalent to
// ConsumeIntegralInRange<uint32_t>(0, 0xFFFFFFFF).
uint16_t ConsumeUint32() {
return ConsumeIntegralInRange(std::numeric_limits<uint32_t>::min(),
std::numeric_limits<uint32_t>::max());
}
// Returns a uint64_t from the input. If fewer than 8 bytes of data remain
// will fill the most significant bytes with 0. This is equivalent to
// ConsumeIntegralInRange<uint64_t>(0, 0xFFFFFFFFFFFFFFFF).
uint16_t ConsumeUint64() {
return ConsumeIntegralInRange(std::numeric_limits<uint64_t>::min(),
std::numeric_limits<uint64_t>::max());
}
// Returns a value from |array|, consuming as many bytes as needed to do so. // Returns a value from |array|, consuming as many bytes as needed to do so.
// |array| must be a fixed-size array. // |array| must be a fixed-size array.
template <typename Type, size_t size> template <typename T, size_t size>
Type PickValueInArray(Type (&array)[size]) { T PickValueInArray(T (&array)[size]) {
return array[ConsumeIntegralInRange<size_t>(0, size - 1)]; return array[ConsumeIntegralInRange<size_t>(0, size - 1)];
} }
......
...@@ -14,11 +14,6 @@ ...@@ -14,11 +14,6 @@
namespace { namespace {
uint32_t GetNextUInt32(base::FuzzedDataProvider* fuzz) {
return fuzz->ConsumeUint32InRange(std::numeric_limits<uint32_t>::min(),
std::numeric_limits<uint32_t>::max());
}
void AddHitTestRegion(base::FuzzedDataProvider* fuzz, void AddHitTestRegion(base::FuzzedDataProvider* fuzz,
std::vector<viz::AggregatedHitTestRegion>* regions, std::vector<viz::AggregatedHitTestRegion>* regions,
std::vector<viz::FrameSinkId>* frame_sink_ids, std::vector<viz::FrameSinkId>* frame_sink_ids,
...@@ -26,17 +21,17 @@ void AddHitTestRegion(base::FuzzedDataProvider* fuzz, ...@@ -26,17 +21,17 @@ void AddHitTestRegion(base::FuzzedDataProvider* fuzz,
constexpr uint32_t kMaxDepthAllowed = 25; constexpr uint32_t kMaxDepthAllowed = 25;
if (fuzz->remaining_bytes() < sizeof(viz::AggregatedHitTestRegion)) if (fuzz->remaining_bytes() < sizeof(viz::AggregatedHitTestRegion))
return; return;
viz::FrameSinkId frame_sink_id(GetNextUInt32(fuzz), GetNextUInt32(fuzz)); viz::FrameSinkId frame_sink_id(fuzz->ConsumeUint32(), fuzz->ConsumeUint32());
uint32_t flags = GetNextUInt32(fuzz); uint32_t flags = fuzz->ConsumeUint32();
// The reasons' value is kNotAsyncHitTest if the flag's value is kHitTestAsk. // The reasons' value is kNotAsyncHitTest if the flag's value is kHitTestAsk.
uint32_t reasons = uint32_t reasons = (flags & viz::HitTestRegionFlags::kHitTestAsk)
(flags & viz::HitTestRegionFlags::kHitTestAsk) ? fuzz->ConsumeIntegralInRange<uint32_t>(
? fuzz->ConsumeUint32InRange(1, std::numeric_limits<uint32_t>::max()) 1, std::numeric_limits<uint32_t>::max())
: viz::AsyncHitTestReasons::kNotAsyncHitTest; : viz::AsyncHitTestReasons::kNotAsyncHitTest;
gfx::Rect rect(fuzz->ConsumeUint8(), fuzz->ConsumeUint8(), gfx::Rect rect(fuzz->ConsumeUint8(), fuzz->ConsumeUint8(),
fuzz->ConsumeUint16(), fuzz->ConsumeUint16()); fuzz->ConsumeUint16(), fuzz->ConsumeUint16());
int32_t child_count = int32_t child_count =
depth < kMaxDepthAllowed ? fuzz->ConsumeUint32InRange(0, 10) : 0; depth < kMaxDepthAllowed ? fuzz->ConsumeIntegralInRange(0, 10) : 0;
gfx::Transform transform; gfx::Transform transform;
if (fuzz->ConsumeBool() && fuzz->remaining_bytes() >= sizeof(transform)) { if (fuzz->ConsumeBool() && fuzz->remaining_bytes() >= sizeof(transform)) {
std::vector<uint8_t> matrix_bytes = std::vector<uint8_t> matrix_bytes =
......
...@@ -25,7 +25,8 @@ constexpr uint32_t kMaxDepthAllowed = 255; ...@@ -25,7 +25,8 @@ constexpr uint32_t kMaxDepthAllowed = 255;
// TODO(riajiang): Move into common functions that can be used by the fuzzer // TODO(riajiang): Move into common functions that can be used by the fuzzer
// for HitTestQuery. // for HitTestQuery.
uint32_t GetNextUInt32NonZero(base::FuzzedDataProvider* fuzz) { uint32_t GetNextUInt32NonZero(base::FuzzedDataProvider* fuzz) {
return fuzz->ConsumeUint32InRange(1, std::numeric_limits<uint32_t>::max()); return fuzz->ConsumeIntegralInRange<uint32_t>(
1, std::numeric_limits<uint32_t>::max());
} }
gfx::Transform GetNextTransform(base::FuzzedDataProvider* fuzz) { gfx::Transform GetNextTransform(base::FuzzedDataProvider* fuzz) {
......
...@@ -27,7 +27,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { ...@@ -27,7 +27,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
auto mi_stream = std::make_unique<content::MerkleIntegritySourceStream>( auto mi_stream = std::make_unique<content::MerkleIntegritySourceStream>(
header, std::move(fuzzed_source_stream)); header, std::move(fuzzed_source_stream));
while (true) { while (true) {
size_t read_size = data_provider.ConsumeUint32InRange(1, 1024); size_t read_size = data_provider.ConsumeIntegralInRange(1, 1024);
auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(read_size); auto io_buffer = base::MakeRefCounted<net::IOBufferWithSize>(read_size);
int result = mi_stream->Read(io_buffer.get(), io_buffer->size(), int result = mi_stream->Read(io_buffer.get(), io_buffer->size(),
callback.callback()); callback.callback());
......
...@@ -46,6 +46,6 @@ ...@@ -46,6 +46,6 @@
# String terminator for FuzzedDataProvider::ConsumeRandomLengthString. # String terminator for FuzzedDataProvider::ConsumeRandomLengthString.
"\\ " "\\ "
# There is a lot of use of ConsumeUint32InRange clients, like ConsumeBool, # There is a lot of use of ConsumeIntegralInRange clients, like ConsumeBool,
# so try make it easy to produce lots of inputs for these. # so try make it easy to produce lots of inputs for these.
"\x00\x00\x00\x00" "\x00\x00\x00\x00"
...@@ -168,14 +168,14 @@ void FuzzedHostResolver::SetDnsClientEnabled(bool enabled) { ...@@ -168,14 +168,14 @@ void FuzzedHostResolver::SetDnsClientEnabled(bool enabled) {
DnsConfig config; DnsConfig config;
// Fuzz name servers. // Fuzz name servers.
uint32_t num_nameservers = data_provider_->ConsumeUint32InRange(0, 4); uint32_t num_nameservers = data_provider_->ConsumeIntegralInRange(0, 4);
for (uint32_t i = 0; i < num_nameservers; ++i) { for (uint32_t i = 0; i < num_nameservers; ++i) {
config.nameservers.push_back( config.nameservers.push_back(
IPEndPoint(FuzzIPAddress(data_provider_), FuzzPort(data_provider_))); IPEndPoint(FuzzIPAddress(data_provider_), FuzzPort(data_provider_)));
} }
// Fuzz suffix search list. // Fuzz suffix search list.
switch (data_provider_->ConsumeUint32InRange(0, 3)) { switch (data_provider_->ConsumeIntegralInRange(0, 3)) {
case 3: case 3:
config.search.push_back("foo.com"); config.search.push_back("foo.com");
FALLTHROUGH; FALLTHROUGH;
...@@ -204,8 +204,8 @@ void FuzzedHostResolver::SetDnsClientEnabled(bool enabled) { ...@@ -204,8 +204,8 @@ void FuzzedHostResolver::SetDnsClientEnabled(bool enabled) {
config.unhandled_options = data_provider_->ConsumeBool(); config.unhandled_options = data_provider_->ConsumeBool();
config.append_to_multi_label_name = data_provider_->ConsumeBool(); config.append_to_multi_label_name = data_provider_->ConsumeBool();
config.randomize_ports = data_provider_->ConsumeBool(); config.randomize_ports = data_provider_->ConsumeBool();
config.ndots = data_provider_->ConsumeInt32InRange(0, 3); config.ndots = data_provider_->ConsumeIntegralInRange(0, 3);
config.attempts = data_provider_->ConsumeInt32InRange(1, 3); config.attempts = data_provider_->ConsumeIntegralInRange(1, 3);
// Timeouts don't really work for fuzzing. Even a timeout of 0 milliseconds // Timeouts don't really work for fuzzing. Even a timeout of 0 milliseconds
// will be increased after the first timeout, resulting in inconsistent // will be increased after the first timeout, resulting in inconsistent
...@@ -218,7 +218,7 @@ void FuzzedHostResolver::SetDnsClientEnabled(bool enabled) { ...@@ -218,7 +218,7 @@ void FuzzedHostResolver::SetDnsClientEnabled(bool enabled) {
std::unique_ptr<DnsClient> dns_client = DnsClient::CreateClientForTesting( std::unique_ptr<DnsClient> dns_client = DnsClient::CreateClientForTesting(
net_log_, &socket_factory_, net_log_, &socket_factory_,
base::Bind(&base::FuzzedDataProvider::ConsumeInt32InRange, base::Bind(&base::FuzzedDataProvider::ConsumeIntegralInRange<int32_t>,
base::Unretained(data_provider_))); base::Unretained(data_provider_)));
dns_client->SetConfig(config); dns_client->SetConfig(config);
SetDnsClient(std::move(dns_client)); SetDnsClient(std::move(dns_client));
......
...@@ -64,8 +64,8 @@ class DnsRequest { ...@@ -64,8 +64,8 @@ class DnsRequest {
std::vector<std::unique_ptr<DnsRequest>>* dns_requests) { std::vector<std::unique_ptr<DnsRequest>>* dns_requests) {
if (dns_requests->empty()) if (dns_requests->empty())
return; return;
uint32_t index = uint32_t index = data_provider->ConsumeIntegralInRange<uint32_t>(
data_provider->ConsumeUint32InRange(0, dns_requests->size() - 1); 0, dns_requests->size() - 1);
// Remove the request from the list before waiting on it - this prevents one // Remove the request from the list before waiting on it - this prevents one
// of the other callbacks from deleting the callback being waited on. // of the other callbacks from deleting the callback being waited on.
...@@ -83,8 +83,8 @@ class DnsRequest { ...@@ -83,8 +83,8 @@ class DnsRequest {
std::vector<std::unique_ptr<DnsRequest>>* dns_requests) { std::vector<std::unique_ptr<DnsRequest>>* dns_requests) {
if (dns_requests->empty()) if (dns_requests->empty())
return; return;
uint32_t index = uint32_t index = data_provider->ConsumeIntegralInRange<uint32_t>(
data_provider->ConsumeUint32InRange(0, dns_requests->size() - 1); 0, dns_requests->size() - 1);
auto request = dns_requests->begin() + index; auto request = dns_requests->begin() + index;
(*request)->Cancel(); (*request)->Cancel();
dns_requests->erase(request); dns_requests->erase(request);
...@@ -112,7 +112,7 @@ class DnsRequest { ...@@ -112,7 +112,7 @@ class DnsRequest {
while (true) { while (true) {
bool done = false; bool done = false;
switch (data_provider_->ConsumeInt32InRange(0, 2)) { switch (data_provider_->ConsumeIntegralInRange(0, 2)) {
case 0: case 0:
// Quit on 0, or when no data is left. // Quit on 0, or when no data is left.
done = true; done = true;
...@@ -141,9 +141,9 @@ class DnsRequest { ...@@ -141,9 +141,9 @@ class DnsRequest {
if (data_provider_->ConsumeBool()) if (data_provider_->ConsumeBool())
info.set_host_resolver_flags(net::HOST_RESOLVER_CANONNAME); info.set_host_resolver_flags(net::HOST_RESOLVER_CANONNAME);
net::RequestPriority priority = net::RequestPriority priority = static_cast<net::RequestPriority>(
static_cast<net::RequestPriority>(data_provider_->ConsumeInt32InRange( data_provider_->ConsumeIntegralInRange<int32_t>(net::MINIMUM_PRIORITY,
net::MINIMUM_PRIORITY, net::MAXIMUM_PRIORITY)); net::MAXIMUM_PRIORITY));
// Decide if should be a cache-only resolution. // Decide if should be a cache-only resolution.
if (data_provider_->ConsumeBool()) { if (data_provider_->ConsumeBool()) {
...@@ -206,7 +206,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { ...@@ -206,7 +206,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
net::TestNetLog net_log; net::TestNetLog net_log;
net::HostResolver::Options options; net::HostResolver::Options options;
options.max_concurrent_resolves = data_provider.ConsumeUint32InRange(1, 8); options.max_concurrent_resolves =
data_provider.ConsumeIntegralInRange(1, 8);
options.enable_caching = data_provider.ConsumeBool(); options.enable_caching = data_provider.ConsumeBool();
net::FuzzedHostResolver host_resolver(options, &net_log, &data_provider); net::FuzzedHostResolver host_resolver(options, &net_log, &data_provider);
host_resolver.SetDnsClientEnabled(data_provider.ConsumeBool()); host_resolver.SetDnsClientEnabled(data_provider.ConsumeBool());
...@@ -214,7 +215,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { ...@@ -214,7 +215,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
std::vector<std::unique_ptr<DnsRequest>> dns_requests; std::vector<std::unique_ptr<DnsRequest>> dns_requests;
bool done = false; bool done = false;
while (!done) { while (!done) {
switch (data_provider.ConsumeInt32InRange(0, 3)) { switch (data_provider.ConsumeIntegralInRange(0, 3)) {
case 0: case 0:
// Quit on 0, or when no data is left. // Quit on 0, or when no data is left.
done = true; done = true;
......
...@@ -40,7 +40,7 @@ int FuzzedSourceStream::Read(IOBuffer* buf, ...@@ -40,7 +40,7 @@ int FuzzedSourceStream::Read(IOBuffer* buf,
DCHECK_LE(0, buf_len); DCHECK_LE(0, buf_len);
bool sync = data_provider_->ConsumeBool(); bool sync = data_provider_->ConsumeBool();
int result = data_provider_->ConsumeUint32InRange(0, buf_len); int result = data_provider_->ConsumeIntegralInRange(0, buf_len);
std::string data = data_provider_->ConsumeBytesAsString(result); std::string data = data_provider_->ConsumeBytesAsString(result);
result = data.size(); result = data.size();
......
...@@ -24,9 +24,7 @@ base::string16 ConsumeRandomLengthString16( ...@@ -24,9 +24,7 @@ base::string16 ConsumeRandomLengthString16(
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
base::FuzzedDataProvider fdp(data, size); base::FuzzedDataProvider fdp(data, size);
bool is_v2 = fdp.ConsumeBool(); bool is_v2 = fdp.ConsumeBool();
uint64_t client_time = uint64_t client_time = fdp.ConsumeUint64();
(static_cast<uint64_t>(fdp.ConsumeUint32InRange(0, 0xffffffffu)) << 32) |
static_cast<uint64_t>(fdp.ConsumeUint32InRange(0, 0xffffffffu));
net::ntlm::NtlmClient client((net::ntlm::NtlmFeatures(is_v2))); net::ntlm::NtlmClient client((net::ntlm::NtlmFeatures(is_v2)));
// Generate the input strings and challenge message. The strings will have a // Generate the input strings and challenge message. The strings will have a
......
...@@ -140,7 +140,7 @@ int FuzzedDatagramClientSocket::Read(IOBuffer* buf, ...@@ -140,7 +140,7 @@ int FuzzedDatagramClientSocket::Read(IOBuffer* buf,
// Get contents of response. // Get contents of response.
std::string data = data_provider_->ConsumeRandomLengthString( std::string data = data_provider_->ConsumeRandomLengthString(
data_provider_->ConsumeUint32InRange(0, buf_len)); data_provider_->ConsumeIntegralInRange(0, buf_len));
int result; int result;
if (data.size() > 0) { if (data.size() > 0) {
......
...@@ -36,7 +36,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { ...@@ -36,7 +36,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
scoped_refptr<net::RuleBasedHostResolverProc> rules( scoped_refptr<net::RuleBasedHostResolverProc> rules(
new net::RuleBasedHostResolverProc(nullptr)); new net::RuleBasedHostResolverProc(nullptr));
mock_host_resolver.set_synchronous_mode(data_provider.ConsumeBool()); mock_host_resolver.set_synchronous_mode(data_provider.ConsumeBool());
switch (data_provider.ConsumeInt32InRange(0, 2)) { switch (data_provider.ConsumeIntegralInRange(0, 2)) {
case 0: case 0:
rules->AddRule("*", "127.0.0.1"); rules->AddRule("*", "127.0.0.1");
break; break;
......
...@@ -15,7 +15,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { ...@@ -15,7 +15,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
base::FuzzedDataProvider fuzzed_data_provider(data, size); base::FuzzedDataProvider fuzzed_data_provider(data, size);
http2::Http2FrameDecoder decoder; http2::Http2FrameDecoder decoder;
while (fuzzed_data_provider.remaining_bytes() > 0) { while (fuzzed_data_provider.remaining_bytes() > 0) {
size_t chunk_size = fuzzed_data_provider.ConsumeUint32InRange(1, 32); size_t chunk_size = fuzzed_data_provider.ConsumeIntegralInRange(1, 32);
std::vector<char> chunk = std::vector<char> chunk =
fuzzed_data_provider.ConsumeBytes<char>(chunk_size); fuzzed_data_provider.ConsumeBytes<char>(chunk_size);
......
...@@ -18,12 +18,12 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { ...@@ -18,12 +18,12 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
base::FuzzedDataProvider fuzzed_data_provider(data, size); base::FuzzedDataProvider fuzzed_data_provider(data, size);
size_t max_string_size = size_t max_string_size =
fuzzed_data_provider.ConsumeUint32InRange(1, 10 * size); fuzzed_data_provider.ConsumeIntegralInRange<size_t>(1, 10 * size);
http2::HpackDecoder decoder(http2::HpackDecoderNoOpListener::NoOpListener(), http2::HpackDecoder decoder(http2::HpackDecoderNoOpListener::NoOpListener(),
max_string_size); max_string_size);
decoder.StartDecodingBlock(); decoder.StartDecodingBlock();
while (fuzzed_data_provider.remaining_bytes() > 0) { while (fuzzed_data_provider.remaining_bytes() > 0) {
size_t chunk_size = fuzzed_data_provider.ConsumeUint32InRange(1, 32); size_t chunk_size = fuzzed_data_provider.ConsumeIntegralInRange(1, 32);
std::vector<char> chunk = std::vector<char> chunk =
fuzzed_data_provider.ConsumeBytes<char>(chunk_size); fuzzed_data_provider.ConsumeBytes<char>(chunk_size);
......
...@@ -38,8 +38,9 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { ...@@ -38,8 +38,9 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
// Process up to 64 kB fragments at a time. Too small upper bound might not // Process up to 64 kB fragments at a time. Too small upper bound might not
// provide enough coverage, too large would make fuzzing less efficient. // provide enough coverage, too large would make fuzzing less efficient.
auto fragment_size_generator = std::bind( auto fragment_size_generator =
&QuicFuzzedDataProvider::ConsumeUint32InRange, &provider, 1, 64 * 1024); std::bind(&QuicFuzzedDataProvider::ConsumeIntegralInRange<uint32_t>,
&provider, 1, 64 * 1024);
QpackDecode( QpackDecode(
&handler, fragment_size_generator, &handler, fragment_size_generator,
......
...@@ -119,8 +119,9 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { ...@@ -119,8 +119,9 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
// Process up to 64 kB fragments at a time. Too small upper bound might not // Process up to 64 kB fragments at a time. Too small upper bound might not
// provide enough coverage, too large would make fuzzing less efficient. // provide enough coverage, too large would make fuzzing less efficient.
auto fragment_size_generator = std::bind( auto fragment_size_generator =
&QuicFuzzedDataProvider::ConsumeUint32InRange, &provider, 1, 64 * 1024); std::bind(&QuicFuzzedDataProvider::ConsumeIntegralInRange<uint32_t>,
&provider, 1, 64 * 1024);
// Encode header list. // Encode header list.
QuicString encoded_header_block = QuicString encoded_header_block =
......
...@@ -47,7 +47,7 @@ class URLRequestDataJobFuzzerHarness : public net::URLRequest::Delegate { ...@@ -47,7 +47,7 @@ class URLRequestDataJobFuzzerHarness : public net::URLRequest::Delegate {
read_lengths_.clear(); read_lengths_.clear();
// Allocate an IOBuffer with fuzzed size. // Allocate an IOBuffer with fuzzed size.
int buf_size = provider.ConsumeUint32InRange(1, 127); // 7 bits. int buf_size = provider.ConsumeIntegralInRange(1, 127); // 7 bits.
buf_ = base::MakeRefCounted<net::IOBufferWithSize>(buf_size); buf_ = base::MakeRefCounted<net::IOBufferWithSize>(buf_size);
// Generate a range header, and a bool determining whether to use it. // Generate a range header, and a bool determining whether to use it.
...@@ -63,7 +63,7 @@ class URLRequestDataJobFuzzerHarness : public net::URLRequest::Delegate { ...@@ -63,7 +63,7 @@ class URLRequestDataJobFuzzerHarness : public net::URLRequest::Delegate {
size_t simulated_bytes_read = 0; size_t simulated_bytes_read = 0;
while (simulated_bytes_read < provider.remaining_bytes() && while (simulated_bytes_read < provider.remaining_bytes() &&
read_lengths_.size() < 20000u) { read_lengths_.size() < 20000u) {
size_t read_length = provider.ConsumeUint32InRange(1, buf_size); size_t read_length = provider.ConsumeIntegralInRange(1, buf_size);
read_lengths_.push_back(read_length); read_lengths_.push_back(read_length);
simulated_bytes_read += read_length; simulated_bytes_read += read_length;
} }
......
...@@ -67,7 +67,8 @@ class WebSocketFuzzedStream final : public WebSocketStream { ...@@ -67,7 +67,8 @@ class WebSocketFuzzedStream final : public WebSocketStream {
private: private:
std::unique_ptr<WebSocketFrame> CreateFrame() { std::unique_ptr<WebSocketFrame> CreateFrame() {
WebSocketFrameHeader::OpCode opcode = WebSocketFrameHeader::OpCode opcode =
fuzzed_data_provider_->ConsumeUint32InRange( fuzzed_data_provider_
->ConsumeIntegralInRange<WebSocketFrameHeader::OpCode>(
WebSocketFrameHeader::kOpCodeContinuation, WebSocketFrameHeader::kOpCodeContinuation,
WebSocketFrameHeader::kOpCodeControlUnused); WebSocketFrameHeader::kOpCodeControlUnused);
auto frame = std::make_unique<WebSocketFrame>(opcode); auto frame = std::make_unique<WebSocketFrame>(opcode);
...@@ -80,7 +81,7 @@ class WebSocketFuzzedStream final : public WebSocketStream { ...@@ -80,7 +81,7 @@ class WebSocketFuzzedStream final : public WebSocketStream {
frame->header.reserved3 = (flags >> 3) & 0x1; frame->header.reserved3 = (flags >> 3) & 0x1;
frame->header.masked = (flags >> 4) & 0x1; frame->header.masked = (flags >> 4) & 0x1;
uint64_t payload_length = uint64_t payload_length =
fuzzed_data_provider_->ConsumeUint32InRange(0, 64); fuzzed_data_provider_->ConsumeIntegralInRange(0, 64);
std::vector<char> payload = std::vector<char> payload =
fuzzed_data_provider_->ConsumeBytes<char>(payload_length); fuzzed_data_provider_->ConsumeBytes<char>(payload_length);
frame->data = base::MakeRefCounted<IOBufferWithSize>(payload.size()); frame->data = base::MakeRefCounted<IOBufferWithSize>(payload.size());
......
...@@ -16,7 +16,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { ...@@ -16,7 +16,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
net::WebSocketFrameParser parser; net::WebSocketFrameParser parser;
std::vector<std::unique_ptr<net::WebSocketFrameChunk>> frame_chunks; std::vector<std::unique_ptr<net::WebSocketFrameChunk>> frame_chunks;
while (fuzzed_data_provider.remaining_bytes() > 0) { while (fuzzed_data_provider.remaining_bytes() > 0) {
size_t chunk_size = fuzzed_data_provider.ConsumeUint32InRange(1, 32); size_t chunk_size = fuzzed_data_provider.ConsumeIntegralInRange(1, 32);
std::vector<char> chunk = std::vector<char> chunk =
fuzzed_data_provider.ConsumeBytes<char>(chunk_size); fuzzed_data_provider.ConsumeBytes<char>(chunk_size);
parser.Decode(chunk.data(), chunk.size(), &frame_chunks); parser.Decode(chunk.data(), chunk.size(), &frame_chunks);
......
...@@ -18,7 +18,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { ...@@ -18,7 +18,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
blink::FuzzedDataProvider provider(data, size); blink::FuzzedDataProvider provider(data, size);
const auto property_id = const auto property_id =
blink::convertToCSSPropertyID(provider.ConsumeInt32InRange( blink::convertToCSSPropertyID(provider.ConsumeIntegralInRange<int>(
blink::firstCSSProperty, blink::lastCSSProperty)); blink::firstCSSProperty, blink::lastCSSProperty));
const auto data_string = provider.ConsumeRemainingBytes(); const auto data_string = provider.ConsumeRemainingBytes();
......
...@@ -22,7 +22,7 @@ class TextResourceDecoderForFuzzing : public TextResourceDecoder { ...@@ -22,7 +22,7 @@ class TextResourceDecoderForFuzzing : public TextResourceDecoder {
static TextResourceDecoderOptions FuzzedOption( static TextResourceDecoderOptions FuzzedOption(
FuzzedDataProvider& fuzzed_data) { FuzzedDataProvider& fuzzed_data) {
switch (static_cast<TextResourceDecoderOptions::EncodingDetectionOption>( switch (static_cast<TextResourceDecoderOptions::EncodingDetectionOption>(
fuzzed_data.ConsumeInt32InRange( fuzzed_data.ConsumeIntegralInRange<int32_t>(
TextResourceDecoderOptions::kUseAllAutoDetection, TextResourceDecoderOptions::kUseAllAutoDetection,
TextResourceDecoderOptions::kAlwaysUseUTF8ForText))) { TextResourceDecoderOptions::kAlwaysUseUTF8ForText))) {
case TextResourceDecoderOptions::kUseAllAutoDetection: case TextResourceDecoderOptions::kUseAllAutoDetection:
...@@ -42,7 +42,7 @@ class TextResourceDecoderForFuzzing : public TextResourceDecoder { ...@@ -42,7 +42,7 @@ class TextResourceDecoderForFuzzing : public TextResourceDecoder {
static TextResourceDecoderOptions::ContentType FuzzedContentType( static TextResourceDecoderOptions::ContentType FuzzedContentType(
FuzzedDataProvider& fuzzed_data) { FuzzedDataProvider& fuzzed_data) {
return static_cast<TextResourceDecoderOptions::ContentType>( return static_cast<TextResourceDecoderOptions::ContentType>(
fuzzed_data.ConsumeInt32InRange( fuzzed_data.ConsumeIntegralInRange<int32_t>(
TextResourceDecoderOptions::kPlainTextContent, TextResourceDecoderOptions::kPlainTextContent,
TextResourceDecoderOptions::kMaxContentType)); TextResourceDecoderOptions::kMaxContentType));
} }
......
...@@ -11,8 +11,7 @@ FuzzedDataProvider::FuzzedDataProvider(const uint8_t* bytes, size_t num_bytes) ...@@ -11,8 +11,7 @@ FuzzedDataProvider::FuzzedDataProvider(const uint8_t* bytes, size_t num_bytes)
CString FuzzedDataProvider::ConsumeBytesInRange(uint32_t min_bytes, CString FuzzedDataProvider::ConsumeBytesInRange(uint32_t min_bytes,
uint32_t max_bytes) { uint32_t max_bytes) {
size_t num_bytes = size_t num_bytes = provider_.ConsumeIntegralInRange(min_bytes, max_bytes);
static_cast<size_t>(provider_.ConsumeUint32InRange(min_bytes, max_bytes));
std::vector<char> bytes = provider_.ConsumeBytes<char>(num_bytes); std::vector<char> bytes = provider_.ConsumeBytes<char>(num_bytes);
return CString(bytes.data(), bytes.size()); return CString(bytes.data(), bytes.size());
} }
...@@ -22,12 +21,4 @@ CString FuzzedDataProvider::ConsumeRemainingBytes() { ...@@ -22,12 +21,4 @@ CString FuzzedDataProvider::ConsumeRemainingBytes() {
return CString(bytes.data(), bytes.size()); return CString(bytes.data(), bytes.size());
} }
bool FuzzedDataProvider::ConsumeBool() {
return provider_.ConsumeBool();
}
int FuzzedDataProvider::ConsumeInt32InRange(int min, int max) {
return provider_.ConsumeInt32InRange(min, max);
}
} // namespace blink } // namespace blink
...@@ -28,19 +28,22 @@ class FuzzedDataProvider { ...@@ -28,19 +28,22 @@ class FuzzedDataProvider {
CString ConsumeRemainingBytes(); CString ConsumeRemainingBytes();
// Returns a bool, or false when no data remains. // Returns a bool, or false when no data remains.
bool ConsumeBool(); bool ConsumeBool() { return provider_.ConsumeBool(); }
// Returns a number in the range [min, max] by consuming bytes from the input // Returns a number in the range [min, max] by consuming bytes from the input
// data. The value might not be uniformly distributed in the given range. If // data. The value might not be uniformly distributed in the given range. If
// there's no input data left, always returns |min|. |min| must be less than // there's no input data left, always returns |min|. |min| must be less than
// or equal to |max|. // or equal to |max|.
int ConsumeInt32InRange(int min, int max); template <typename T>
T ConsumeIntegralInRange(T min, T max) {
return provider_.ConsumeIntegralInRange<T>(min, max);
}
// Returns a value from |array|, consuming as many bytes as needed to do so. // Returns a value from |array|, consuming as many bytes as needed to do so.
// |array| must be a fixed-size array. // |array| must be a fixed-size array.
template <typename Type, size_t size> template <typename T, size_t size>
Type PickValueInArray(Type (&array)[size]) { T PickValueInArray(T (&array)[size]) {
return array[provider_.ConsumeUint32InRange(0, size - 1)]; return array[provider_.ConsumeIntegralInRange<size_t>(0, size - 1)];
} }
// Reports the remaining bytes available for fuzzed input. // Reports the remaining bytes available for fuzzed input.
......
...@@ -21,11 +21,12 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { ...@@ -21,11 +21,12 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
CompactEncDet::TextCorpusType corpus = CompactEncDet::TextCorpusType corpus =
static_cast<CompactEncDet::TextCorpusType>( static_cast<CompactEncDet::TextCorpusType>(
data_provider.ConsumeInt32InRange(0, CompactEncDet::NUM_CORPA)); data_provider.ConsumeIntegralInRange<int32_t>(
0, CompactEncDet::NUM_CORPA));
Encoding encoding_hint = static_cast<Encoding>( Encoding encoding_hint = static_cast<Encoding>(
data_provider.ConsumeInt32InRange(0, NUM_ENCODINGS)); data_provider.ConsumeIntegralInRange<int32_t>(0, NUM_ENCODINGS));
Language langauge_hint = static_cast<Language>( Language langauge_hint = static_cast<Language>(
data_provider.ConsumeInt32InRange(0, NUM_LANGUAGES)); data_provider.ConsumeIntegralInRange<int32_t>(0, NUM_LANGUAGES));
bool ignore_7bit_mail_encodings = data_provider.ConsumeBool(); bool ignore_7bit_mail_encodings = data_provider.ConsumeBool();
std::vector<char> text = data_provider.ConsumeRemainingBytes<char>(); std::vector<char> text = data_provider.ConsumeRemainingBytes<char>();
......
...@@ -16,10 +16,11 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { ...@@ -16,10 +16,11 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
constexpr int kMaxFontSize = 50 * 1024 * 1024; constexpr int kMaxFontSize = 50 * 1024 * 1024;
base::FuzzedDataProvider fuzzed_data(data, size); base::FuzzedDataProvider fuzzed_data(data, size);
size_t font_name_size = fuzzed_data.ConsumeUint32InRange(0, kMaxFontNameSize); size_t font_name_size =
fuzzed_data.ConsumeIntegralInRange(0, kMaxFontNameSize);
std::string font_name = fuzzed_data.ConsumeBytesAsString(font_name_size); std::string font_name = fuzzed_data.ConsumeBytesAsString(font_name_size);
size_t font_str_size = fuzzed_data.ConsumeUint32InRange(0, kMaxFontSize); size_t font_str_size = fuzzed_data.ConsumeIntegralInRange(0, kMaxFontSize);
std::vector<unsigned char> font_str = std::vector<unsigned char> font_str =
fuzzed_data.ConsumeBytes<unsigned char>(font_str_size); fuzzed_data.ConsumeBytes<unsigned char>(font_str_size);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment