fuzz: add new oss-fuzz fuzzer for date.c / date.h
Signed-off-by: Arthur Chan <arthur.chan@adalogics.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Arthur Chan committed
Nov 17, 2023 at 17:47 UTC
ee41e2d41ffe05b0521e1b6d929b59db310d326e
3 files changed
+51
Makefile
+1
@@ -750,6 +750,7 @@ SCRIPTS = $(SCRIPT_SH_GEN) \
750
ETAGS_TARGET = TAGS
751
752
FUZZ_OBJS += oss-fuzz/fuzz-commit-graph.o
753
+FUZZ_OBJS += oss-fuzz/fuzz-date.o
754
FUZZ_OBJS += oss-fuzz/fuzz-pack-headers.o
755
FUZZ_OBJS += oss-fuzz/fuzz-pack-idx.o
756
.PHONY: fuzz-objs
oss-fuzz/.gitignore
+1
@@ -1,3 +1,4 @@
1
fuzz-commit-graph
2
+fuzz-date
3
fuzz-pack-headers
4
fuzz-pack-idx
oss-fuzz/fuzz-date.c
new
+49
@@ -0,0 +1,49 @@
1
+#include "git-compat-util.h"
2
+#include "date.h"
3
+
4
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
5
+
6
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
7
+{
8
+ int local;
9
+ int num;
10
+ char *str;
11
+ int16_t tz;
12
+ timestamp_t ts;
13
+ enum date_mode_type dmtype;
14
+ struct date_mode *dm;
15
+
16
+ if (size <= 4)
17
+ /*
18
+ * we use the first byte to fuzz dmtype and the
19
+ * second byte to fuzz local, then the next two
20
+ * bytes to fuzz tz offset. The remainder
21
+ * (at least one byte) is fed as input to
22
+ * approxidate_careful().
23
+ */
24
+ return 0;
25
+
26
+ local = !!(*data++ & 0x10);
27
+ num = *data++ % DATE_UNIX;
28
+ if (num >= DATE_STRFTIME)
29
+ num++;
30
+ dmtype = (enum date_mode_type)num;
31
+ size -= 2;
32
+
33
+ tz = *data++;
34
+ tz = (tz << 8) | *data++;
35
+ size -= 2;
36
+
37
+ str = xmemdupz(data, size);
38
+
39
+ ts = approxidate_careful(str, &num);
40
+ free(str);
41
+
42
+ dm = date_mode_from_type(dmtype);
43
+ dm->local = local;
44
+ show_date(ts, (int)tz, dm);
45
+
46
+ date_mode_release(dm);
47
+
48
+ return 0;
49
+}