Skip to content

Commit

Permalink
fuzz: add new oss-fuzz fuzzer for date.c / date.h
Browse files Browse the repository at this point in the history
Signed-off-by: Arthur Chan <arthur.chan@adalogics.com>
  • Loading branch information
arthurscchan committed Nov 17, 2023
1 parent dadef80 commit fcc1933
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 0 deletions.
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions oss-fuzz/.gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
fuzz-commit-graph
fuzz-date
fuzz-pack-headers
fuzz-pack-idx
49 changes: 49 additions & 0 deletions oss-fuzz/fuzz-date.c
Original file line number Diff line number Diff line change
@@ -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, and 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;
}

0 comments on commit fcc1933

Please sign in to comment.