commit - 9a72c36fc4346aa318610b3e5d206698f8f4e0bf
commit + 64c1c0c3de7c3ab20ca3e0a4f741ed8e6bc54450
blob - 4cc4351fc9ff8b0523bfe504aaacb9b370638ad2
blob + 6d1b7f24d1d5e0c36176a6d2e5e747eb24f4b976
--- src/lib/tzcode/strptime.c
+++ src/lib/tzcode/strptime.c
;
c = *ptr++;
- assert(c == 'f');
+ if (c != 'f')
+ return NULL;
/* fallthru */
case 'f':
if (!is_digit((u_char)*buf))
blob - a082b735af674c090fb6a35a5a0d8012ed144d2e
blob + 183b676e76ea7e3f444712e439d15bf10b9c9179
--- test/fuzz/CMakeLists.txt
+++ test/fuzz/CMakeLists.txt
)
create_fuzz_test(PREFIX datetime_strptime
- SOURCES datetime_strptime_fuzzer.c
+ SOURCES datetime_strptime_fuzzer.cc
LIBRARIES core fuzzer_config
)
blob - 0d00903e0e32604c777ef7996566463af5e0217f (mode 644)
blob + /dev/null
--- test/fuzz/datetime_strptime_fuzzer.c
+++ /dev/null
-#include <stdlib.h>
-#include <string.h>
-#include "datetime.h"
-#include "trivia/util.h"
-
-void
-cord_on_yield(void) {}
-
-int
-LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
-{
- char *buf = xcalloc(size + 1, sizeof(char));
- if (buf == NULL)
- return 0;
- memcpy(buf, data, size);
- buf[size] = '\0';
- struct datetime date_expected;
- datetime_strptime(&date_expected, buf, "iso8601");
- free(buf);
-
- return 0;
-}
blob - /dev/null
blob + f644f38025d5f8a636184ae62693f93c3233af4c (mode 644)
--- /dev/null
+++ test/fuzz/datetime_strptime_fuzzer.cc
+#include <fuzzer/FuzzedDataProvider.h>
+#include <stddef.h>
+
+#include "datetime.h"
+
+extern "C" void
+cord_on_yield(void) {}
+
+extern "C" int
+LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
+{
+ FuzzedDataProvider fdp(data, size);
+
+ auto buf = fdp.ConsumeRandomLengthString();
+ auto fmt = fdp.ConsumeRandomLengthString();
+
+ struct datetime date_expected;
+ datetime_strptime(&date_expected, buf.c_str(), fmt.c_str());
+
+ return 0;
+}