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>
This commit is contained in:
Arthur Chan 2023-11-17 17:47:47 +00:00 committed by Junio C Hamano
parent 61a22ddaf0
commit ee41e2d41f
3 changed files with 51 additions and 0 deletions

View File

@ -750,6 +750,7 @@ SCRIPTS = $(SCRIPT_SH_GEN) \
ETAGS_TARGET = TAGS
FUZZ_OBJS += oss-fuzz/fuzz-commit-graph.o
FUZZ_OBJS += oss-fuzz/fuzz-date.o
FUZZ_OBJS += oss-fuzz/fuzz-pack-headers.o
FUZZ_OBJS += oss-fuzz/fuzz-pack-idx.o
.PHONY: fuzz-objs

1
oss-fuzz/.gitignore vendored
View File

@ -1,3 +1,4 @@
fuzz-commit-graph
fuzz-date
fuzz-pack-headers
fuzz-pack-idx

49
oss-fuzz/fuzz-date.c Normal file
View File

@ -0,0 +1,49 @@
#include "git-compat-util.h"
#include "date.h"
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
{
int local;
int num;
char *str;
int16_t tz;
timestamp_t ts;
enum date_mode_type dmtype;
struct date_mode *dm;
if (size <= 4)
/*
* we use the first byte to fuzz dmtype and the
* second byte to fuzz local, then the next two
* bytes to fuzz tz offset. The remainder
* (at least one byte) is fed as input to
* approxidate_careful().
*/
return 0;
local = !!(*data++ & 0x10);
num = *data++ % DATE_UNIX;
if (num >= DATE_STRFTIME)
num++;
dmtype = (enum date_mode_type)num;
size -= 2;
tz = *data++;
tz = (tz << 8) | *data++;
size -= 2;
str = xmemdupz(data, size);
ts = approxidate_careful(str, &num);
free(str);
dm = date_mode_from_type(dmtype);
dm->local = local;
show_date(ts, (int)tz, dm);
date_mode_release(dm);
return 0;
}