1*635a8641SAndroid Build Coastguard Worker // Copyright 2015 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Worker #include <stddef.h>
6*635a8641SAndroid Build Coastguard Worker #include <stdint.h>
7*635a8641SAndroid Build Coastguard Worker
8*635a8641SAndroid Build Coastguard Worker #include <string>
9*635a8641SAndroid Build Coastguard Worker
10*635a8641SAndroid Build Coastguard Worker #include "base/strings/string_tokenizer.h"
11*635a8641SAndroid Build Coastguard Worker
GetAllTokens(base::StringTokenizer & t)12*635a8641SAndroid Build Coastguard Worker void GetAllTokens(base::StringTokenizer& t) {
13*635a8641SAndroid Build Coastguard Worker while (t.GetNext()) {
14*635a8641SAndroid Build Coastguard Worker (void)t.token();
15*635a8641SAndroid Build Coastguard Worker }
16*635a8641SAndroid Build Coastguard Worker }
17*635a8641SAndroid Build Coastguard Worker
18*635a8641SAndroid Build Coastguard Worker // Entry point for LibFuzzer.
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)19*635a8641SAndroid Build Coastguard Worker extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
20*635a8641SAndroid Build Coastguard Worker uint8_t size_t_bytes = sizeof(size_t);
21*635a8641SAndroid Build Coastguard Worker if (size < size_t_bytes + 1) {
22*635a8641SAndroid Build Coastguard Worker return 0;
23*635a8641SAndroid Build Coastguard Worker }
24*635a8641SAndroid Build Coastguard Worker
25*635a8641SAndroid Build Coastguard Worker // Calculate pattern size based on remaining bytes, otherwise fuzzing is
26*635a8641SAndroid Build Coastguard Worker // inefficient with bailouts in most cases.
27*635a8641SAndroid Build Coastguard Worker size_t pattern_size =
28*635a8641SAndroid Build Coastguard Worker *reinterpret_cast<const size_t*>(data) % (size - size_t_bytes);
29*635a8641SAndroid Build Coastguard Worker
30*635a8641SAndroid Build Coastguard Worker std::string pattern(reinterpret_cast<const char*>(data + size_t_bytes),
31*635a8641SAndroid Build Coastguard Worker pattern_size);
32*635a8641SAndroid Build Coastguard Worker std::string input(
33*635a8641SAndroid Build Coastguard Worker reinterpret_cast<const char*>(data + size_t_bytes + pattern_size),
34*635a8641SAndroid Build Coastguard Worker size - pattern_size - size_t_bytes);
35*635a8641SAndroid Build Coastguard Worker
36*635a8641SAndroid Build Coastguard Worker // Allow quote_chars and options to be set. Otherwise full coverage
37*635a8641SAndroid Build Coastguard Worker // won't be possible since IsQuote, FullGetNext and other functions
38*635a8641SAndroid Build Coastguard Worker // won't be called.
39*635a8641SAndroid Build Coastguard Worker base::StringTokenizer t(input, pattern);
40*635a8641SAndroid Build Coastguard Worker GetAllTokens(t);
41*635a8641SAndroid Build Coastguard Worker
42*635a8641SAndroid Build Coastguard Worker base::StringTokenizer t_quote(input, pattern);
43*635a8641SAndroid Build Coastguard Worker t_quote.set_quote_chars("\"");
44*635a8641SAndroid Build Coastguard Worker GetAllTokens(t_quote);
45*635a8641SAndroid Build Coastguard Worker
46*635a8641SAndroid Build Coastguard Worker base::StringTokenizer t_options(input, pattern);
47*635a8641SAndroid Build Coastguard Worker t_options.set_options(base::StringTokenizer::RETURN_DELIMS);
48*635a8641SAndroid Build Coastguard Worker GetAllTokens(t_options);
49*635a8641SAndroid Build Coastguard Worker
50*635a8641SAndroid Build Coastguard Worker base::StringTokenizer t_quote_and_options(input, pattern);
51*635a8641SAndroid Build Coastguard Worker t_quote_and_options.set_quote_chars("\"");
52*635a8641SAndroid Build Coastguard Worker t_quote_and_options.set_options(base::StringTokenizer::RETURN_DELIMS);
53*635a8641SAndroid Build Coastguard Worker GetAllTokens(t_quote_and_options);
54*635a8641SAndroid Build Coastguard Worker
55*635a8641SAndroid Build Coastguard Worker return 0;
56*635a8641SAndroid Build Coastguard Worker }
57