1 // Copyright 2018 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/macros.h"
6 #include "base/pickle.h"
7 #include "base/test/fuzzed_data_provider.h"
10 constexpr int kIterations = 16;
11 constexpr int kReadControlBytes = 32;
12 constexpr int kReadDataTypes = 17;
13 constexpr int kMaxReadLength = 1024;
14 constexpr int kMaxSkipBytes = 1024;
17 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
18 if (size < kReadControlBytes) {
21 // Use the first kReadControlBytes bytes of the fuzzer input to control how
22 // the pickled data is read.
23 base::FuzzedDataProvider data_provider(data, kReadControlBytes);
24 data += kReadControlBytes;
25 size -= kReadControlBytes;
27 base::Pickle pickle(reinterpret_cast<const char*>(data), size);
28 base::PickleIterator iter(pickle);
29 for (int i = 0; i < kIterations; i++) {
30 uint8_t read_type = data_provider.ConsumeIntegral<uint8_t>();
31 switch (read_type % kReadDataTypes) {
34 ignore_result(iter.ReadBool(&result));
39 ignore_result(iter.ReadInt(&result));
44 ignore_result(iter.ReadLong(&result));
49 ignore_result(iter.ReadUInt16(&result));
54 ignore_result(iter.ReadUInt32(&result));
59 ignore_result(iter.ReadInt64(&result));
64 ignore_result(iter.ReadUInt64(&result));
69 ignore_result(iter.ReadFloat(&result));
74 ignore_result(iter.ReadDouble(&result));
79 ignore_result(iter.ReadString(&result));
83 base::StringPiece result;
84 ignore_result(iter.ReadStringPiece(&result));
88 base::string16 result;
89 ignore_result(iter.ReadString16(&result));
93 base::StringPiece16 result;
94 ignore_result(iter.ReadStringPiece16(&result));
98 const char* data_result = nullptr;
99 int length_result = 0;
100 ignore_result(iter.ReadData(&data_result, &length_result));
104 const char* data_result = nullptr;
106 data_provider.ConsumeIntegralInRange(0, kMaxReadLength);
107 ignore_result(iter.ReadBytes(&data_result, read_length));
112 ignore_result(iter.ReadLength(&result));
116 ignore_result(iter.SkipBytes(
117 data_provider.ConsumeIntegralInRange(0, kMaxSkipBytes)));