git/oss-fuzz/fuzz-date.c

50 lines
947 B
C

#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;
}