xref: /aosp_15_r20/external/cronet/base/time/time_fuzzer.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2021 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <fuzzer/FuzzedDataProvider.h>
6 #include <stddef.h>
7 #include <stdint.h>
8 
9 #include <string>
10 #include <tuple>
11 
12 #include "base/test/icu_test_util.h"
13 #include "base/time/time.h"
14 
15 namespace {
16 
FuzzStringConversions(const uint8_t * data,size_t size)17 void FuzzStringConversions(const uint8_t* data, size_t size) {
18   FuzzedDataProvider provider(data, size);
19   std::string str = provider.ConsumeRemainingBytesAsString();
20   base::Time dummy;
21   std::ignore = base::Time::FromString(str.c_str(), &dummy);
22   std::ignore = base::Time::FromUTCString(str.c_str(), &dummy);
23 }
24 
FuzzExplodedConversions(const uint8_t * data,size_t size)25 void FuzzExplodedConversions(const uint8_t* data, size_t size) {
26   FuzzedDataProvider provider(data, size);
27   base::Time::Exploded exploded = {
28       .year = provider.ConsumeIntegral<int>(),
29       .month = provider.ConsumeIntegral<int>(),
30       .day_of_week = provider.ConsumeIntegral<int>(),
31       .day_of_month = provider.ConsumeIntegral<int>(),
32       .hour = provider.ConsumeIntegral<int>(),
33       .minute = provider.ConsumeIntegral<int>(),
34       .second = provider.ConsumeIntegral<int>(),
35       .millisecond = provider.ConsumeIntegral<int>(),
36   };
37 
38   base::Time dummy;
39   std::ignore = base::Time::FromUTCExploded(exploded, &dummy);
40   std::ignore = base::Time::FromLocalExploded(exploded, &dummy);
41 }
42 
43 }  // namespace
44 
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)45 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
46   // Fuzz with a constant time zone to make reproduction of bugs easier.
47   base::test::ScopedRestoreDefaultTimezone test_tz("America/Los_Angeles");
48 
49   FuzzStringConversions(data, size);
50   FuzzExplodedConversions(data, size);
51 
52   return 0;
53 }
54