1*6777b538SAndroid Build Coastguard Worker // Copyright 2018 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #include <fuzzer/FuzzedDataProvider.h> 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker #include <tuple> 8*6777b538SAndroid Build Coastguard Worker 9*6777b538SAndroid Build Coastguard Worker #include "base/containers/span.h" 10*6777b538SAndroid Build Coastguard Worker #include "base/pickle.h" 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker namespace { 13*6777b538SAndroid Build Coastguard Worker constexpr int kIterations = 16; 14*6777b538SAndroid Build Coastguard Worker constexpr int kReadControlBytes = 32; 15*6777b538SAndroid Build Coastguard Worker constexpr int kReadDataTypes = 17; 16*6777b538SAndroid Build Coastguard Worker constexpr int kMaxReadLength = 1024; 17*6777b538SAndroid Build Coastguard Worker constexpr int kMaxSkipBytes = 1024; 18*6777b538SAndroid Build Coastguard Worker } // namespace 19*6777b538SAndroid Build Coastguard Worker LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)20*6777b538SAndroid Build Coastguard Workerextern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { 21*6777b538SAndroid Build Coastguard Worker if (size < kReadControlBytes) { 22*6777b538SAndroid Build Coastguard Worker return 0; 23*6777b538SAndroid Build Coastguard Worker } 24*6777b538SAndroid Build Coastguard Worker // Use the first kReadControlBytes bytes of the fuzzer input to control how 25*6777b538SAndroid Build Coastguard Worker // the pickled data is read. 26*6777b538SAndroid Build Coastguard Worker FuzzedDataProvider data_provider(data, kReadControlBytes); 27*6777b538SAndroid Build Coastguard Worker data += kReadControlBytes; 28*6777b538SAndroid Build Coastguard Worker size -= kReadControlBytes; 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Worker base::Pickle pickle = 31*6777b538SAndroid Build Coastguard Worker base::Pickle::WithUnownedBuffer(UNSAFE_BUFFERS(base::span(data, size))); 32*6777b538SAndroid Build Coastguard Worker base::PickleIterator iter(pickle); 33*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < kIterations; i++) { 34*6777b538SAndroid Build Coastguard Worker uint8_t read_type = data_provider.ConsumeIntegral<uint8_t>(); 35*6777b538SAndroid Build Coastguard Worker switch (read_type % kReadDataTypes) { 36*6777b538SAndroid Build Coastguard Worker case 0: { 37*6777b538SAndroid Build Coastguard Worker bool result = 0; 38*6777b538SAndroid Build Coastguard Worker std::ignore = iter.ReadBool(&result); 39*6777b538SAndroid Build Coastguard Worker break; 40*6777b538SAndroid Build Coastguard Worker } 41*6777b538SAndroid Build Coastguard Worker case 1: { 42*6777b538SAndroid Build Coastguard Worker int result = 0; 43*6777b538SAndroid Build Coastguard Worker std::ignore = iter.ReadInt(&result); 44*6777b538SAndroid Build Coastguard Worker break; 45*6777b538SAndroid Build Coastguard Worker } 46*6777b538SAndroid Build Coastguard Worker case 2: { 47*6777b538SAndroid Build Coastguard Worker long result = 0; 48*6777b538SAndroid Build Coastguard Worker std::ignore = iter.ReadLong(&result); 49*6777b538SAndroid Build Coastguard Worker break; 50*6777b538SAndroid Build Coastguard Worker } 51*6777b538SAndroid Build Coastguard Worker case 3: { 52*6777b538SAndroid Build Coastguard Worker uint16_t result = 0; 53*6777b538SAndroid Build Coastguard Worker std::ignore = iter.ReadUInt16(&result); 54*6777b538SAndroid Build Coastguard Worker break; 55*6777b538SAndroid Build Coastguard Worker } 56*6777b538SAndroid Build Coastguard Worker case 4: { 57*6777b538SAndroid Build Coastguard Worker uint32_t result = 0; 58*6777b538SAndroid Build Coastguard Worker std::ignore = iter.ReadUInt32(&result); 59*6777b538SAndroid Build Coastguard Worker break; 60*6777b538SAndroid Build Coastguard Worker } 61*6777b538SAndroid Build Coastguard Worker case 5: { 62*6777b538SAndroid Build Coastguard Worker int64_t result = 0; 63*6777b538SAndroid Build Coastguard Worker std::ignore = iter.ReadInt64(&result); 64*6777b538SAndroid Build Coastguard Worker break; 65*6777b538SAndroid Build Coastguard Worker } 66*6777b538SAndroid Build Coastguard Worker case 6: { 67*6777b538SAndroid Build Coastguard Worker uint64_t result = 0; 68*6777b538SAndroid Build Coastguard Worker std::ignore = iter.ReadUInt64(&result); 69*6777b538SAndroid Build Coastguard Worker break; 70*6777b538SAndroid Build Coastguard Worker } 71*6777b538SAndroid Build Coastguard Worker case 7: { 72*6777b538SAndroid Build Coastguard Worker float result = 0; 73*6777b538SAndroid Build Coastguard Worker std::ignore = iter.ReadFloat(&result); 74*6777b538SAndroid Build Coastguard Worker break; 75*6777b538SAndroid Build Coastguard Worker } 76*6777b538SAndroid Build Coastguard Worker case 8: { 77*6777b538SAndroid Build Coastguard Worker double result = 0; 78*6777b538SAndroid Build Coastguard Worker std::ignore = iter.ReadDouble(&result); 79*6777b538SAndroid Build Coastguard Worker break; 80*6777b538SAndroid Build Coastguard Worker } 81*6777b538SAndroid Build Coastguard Worker case 9: { 82*6777b538SAndroid Build Coastguard Worker std::string result; 83*6777b538SAndroid Build Coastguard Worker std::ignore = iter.ReadString(&result); 84*6777b538SAndroid Build Coastguard Worker break; 85*6777b538SAndroid Build Coastguard Worker } 86*6777b538SAndroid Build Coastguard Worker case 10: { 87*6777b538SAndroid Build Coastguard Worker base::StringPiece result; 88*6777b538SAndroid Build Coastguard Worker std::ignore = iter.ReadStringPiece(&result); 89*6777b538SAndroid Build Coastguard Worker break; 90*6777b538SAndroid Build Coastguard Worker } 91*6777b538SAndroid Build Coastguard Worker case 11: { 92*6777b538SAndroid Build Coastguard Worker std::u16string result; 93*6777b538SAndroid Build Coastguard Worker std::ignore = iter.ReadString16(&result); 94*6777b538SAndroid Build Coastguard Worker break; 95*6777b538SAndroid Build Coastguard Worker } 96*6777b538SAndroid Build Coastguard Worker case 12: { 97*6777b538SAndroid Build Coastguard Worker base::StringPiece16 result; 98*6777b538SAndroid Build Coastguard Worker std::ignore = iter.ReadStringPiece16(&result); 99*6777b538SAndroid Build Coastguard Worker break; 100*6777b538SAndroid Build Coastguard Worker } 101*6777b538SAndroid Build Coastguard Worker case 13: { 102*6777b538SAndroid Build Coastguard Worker const char* data_result = nullptr; 103*6777b538SAndroid Build Coastguard Worker size_t length_result = 0; 104*6777b538SAndroid Build Coastguard Worker std::ignore = iter.ReadData(&data_result, &length_result); 105*6777b538SAndroid Build Coastguard Worker break; 106*6777b538SAndroid Build Coastguard Worker } 107*6777b538SAndroid Build Coastguard Worker case 14: { 108*6777b538SAndroid Build Coastguard Worker const char* data_result = nullptr; 109*6777b538SAndroid Build Coastguard Worker int read_length = 110*6777b538SAndroid Build Coastguard Worker data_provider.ConsumeIntegralInRange(0, kMaxReadLength); 111*6777b538SAndroid Build Coastguard Worker std::ignore = 112*6777b538SAndroid Build Coastguard Worker iter.ReadBytes(&data_result, static_cast<size_t>(read_length)); 113*6777b538SAndroid Build Coastguard Worker break; 114*6777b538SAndroid Build Coastguard Worker } 115*6777b538SAndroid Build Coastguard Worker case 15: { 116*6777b538SAndroid Build Coastguard Worker size_t result = 0; 117*6777b538SAndroid Build Coastguard Worker std::ignore = iter.ReadLength(&result); 118*6777b538SAndroid Build Coastguard Worker break; 119*6777b538SAndroid Build Coastguard Worker } 120*6777b538SAndroid Build Coastguard Worker case 16: { 121*6777b538SAndroid Build Coastguard Worker std::ignore = iter.SkipBytes(static_cast<size_t>( 122*6777b538SAndroid Build Coastguard Worker data_provider.ConsumeIntegralInRange(0, kMaxSkipBytes))); 123*6777b538SAndroid Build Coastguard Worker break; 124*6777b538SAndroid Build Coastguard Worker } 125*6777b538SAndroid Build Coastguard Worker } 126*6777b538SAndroid Build Coastguard Worker } 127*6777b538SAndroid Build Coastguard Worker 128*6777b538SAndroid Build Coastguard Worker return 0; 129*6777b538SAndroid Build Coastguard Worker } 130