$NetBSD: patch-al,v 1.3 2021/05/20 19:21:13 christos Exp $ --- dates.c.orig 2021-05-20 15:01:53.692058779 -0400 +++ dates.c 2021-05-20 15:14:15.931558100 -0400 @@ -101,7 +101,7 @@ { long year, julian; - if (tym->tm_year < 100) + if (tym->tm_year < 1000) year = tym->tm_year + 1900; if (year < 69) year += 100; @@ -123,7 +123,7 @@ struct tm *T; char *tz; #if defined(SYSV) || defined(TIMEZONE) || defined(POSIX) - long x; + time_t x; (void) time(&x); T = localtime(&x); @@ -172,7 +172,7 @@ static char time_buf[30]; struct tm *T; register char *p = time_buf; - long x; + time_t x; if (!opts) return NULL; @@ -375,6 +375,11 @@ } if (Year > 1900) Year -= 1900; + else if (Year < 0) { + print("Unknown date format: %s\n", p); + return NULL; + } + if (!Month && (Month = month_to_n(month)) == -1) { print("bad month: %s\n", p); return NULL; @@ -413,6 +418,7 @@ char *Date, *Yr, *Mon, *Day, *Wkday, *Tm, *Zone, *ret_buf; { long gmt; + time_t tgmt; struct tm *T; char a_or_p, *p = ret_buf; @@ -420,7 +426,8 @@ (void) sscanf(Date, "%ld%3c%s", &gmt, Wkday, Zone); Wkday[3] = 0; gmt += getzoff(Zone); - T = gmtime(&gmt); + tgmt = gmt < 0 ? 0 : gmt; + T = gmtime(&tgmt); a_or_p = (T->tm_hour < 12)? 'a': 'p'; (void) sprintf(Yr, "%d", T->tm_year + 1900);