xref: /aosp_15_r20/external/cronet/base/pickle_fuzzer.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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 Worker extern "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