xref: /aosp_15_r20/external/libchrome/base/strings/string_tokenizer_fuzzer.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
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