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