Commit Diff


commit - 9a72c36fc4346aa318610b3e5d206698f8f4e0bf
commit + 64c1c0c3de7c3ab20ca3e0a4f741ed8e6bc54450
blob - 4cc4351fc9ff8b0523bfe504aaacb9b370638ad2
blob + 6d1b7f24d1d5e0c36176a6d2e5e747eb24f4b976
--- src/lib/tzcode/strptime.c
+++ src/lib/tzcode/strptime.c
@@ -262,7 +262,8 @@ tnt_strptime(const char *__restrict buf, const char *_
 				;
 
 			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
@@ -84,7 +84,7 @@ create_fuzz_test(PREFIX datetime_parse_full
 )
 
 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
@@ -1,22 +0,0 @@
-#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
@@ -0,0 +1,21 @@
+#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;
+}