Module Name: src Committed By: mlelstv Date: Sat Oct 24 17:01:04 UTC 2009
Modified Files: src/lib/libc/time: localtime.c Log Message: With 64bit time_t years can be negative and lapyear computation requires rounding down. This avoids an infinite loop in localtime(). To generate a diff of this commit: cvs rdiff -u -r1.43 -r1.44 src/lib/libc/time/localtime.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libc/time/localtime.c diff -u src/lib/libc/time/localtime.c:1.43 src/lib/libc/time/localtime.c:1.44 --- src/lib/libc/time/localtime.c:1.43 Sun Jan 18 10:57:15 2009 +++ src/lib/libc/time/localtime.c Sat Oct 24 17:01:04 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: localtime.c,v 1.43 2009/01/18 10:57:15 drochner Exp $ */ +/* $NetBSD: localtime.c,v 1.44 2009/10/24 17:01:04 mlelstv Exp $ */ /* ** This file is in the public domain, so clarified as of @@ -10,7 +10,7 @@ #if 0 static char elsieid[] = "@(#)localtime.c 7.78"; #else -__RCSID("$NetBSD: localtime.c,v 1.43 2009/01/18 10:57:15 drochner Exp $"); +__RCSID("$NetBSD: localtime.c,v 1.44 2009/10/24 17:01:04 mlelstv Exp $"); #endif #endif /* LIBC_SCCS and not lint */ @@ -1290,7 +1290,7 @@ if (tmp->tm_wday < 0) tmp->tm_wday += DAYSPERWEEK; y = EPOCH_YEAR; -#define LEAPS_THRU_END_OF(y) ((y) / 4 - (y) / 100 + (y) / 400) +#define LEAPS_THRU_END_OF(y) ((y) < 0 ? ((y)-3)/4 - ((y)-99)/100 + ((y)-399)/400 : (y)/4 - (y)/100 + (y)/400) while (days < 0 || days >= (long) year_lengths[yleap = isleap(y)]) { register time_t newy; newy = (y + days / DAYSPERNYEAR);