diff options
author | Roland McGrath <roland@gnu.org> | 2004-10-22 22:24:08 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2004-10-22 22:24:08 +0000 |
commit | 030d37152aa8e50653c4591e42ba7efe80fd1fc6 (patch) | |
tree | 6cf43ce359d379f2f4ca77e847bbb88520c88293 | |
parent | 347a6c2dd8ca5208c16c9d3f32160defe7a7eda1 (diff) | |
download | glibc-030d37152aa8e50653c4591e42ba7efe80fd1fc6.zip glibc-030d37152aa8e50653c4591e42ba7efe80fd1fc6.tar.gz glibc-030d37152aa8e50653c4591e42ba7efe80fd1fc6.tar.bz2 |
[BZ #471] Fix imported from gnulib.
* time/mktime.c (leapyear, ydms_tm_diff): Year is of type
long int, not int, to avoid problems when tm_year == INT_MAX
and tm_mon > 12.
(__mktime_intenral): Compute year using long int arithmetic,
not int arithmetic, to avoid problems on hosts where time_t
and long are 64 bits but int is 32.
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | time/mktime.c | 7 |
2 files changed, 12 insertions, 3 deletions
@@ -1,5 +1,13 @@ 2004-10-22 Paul Eggert <eggert@cs.ucla.edu> + [BZ #471] Fix imported from gnulib. + * time/mktime.c (leapyear, ydms_tm_diff): Year is of type + long int, not int, to avoid problems when tm_year == INT_MAX + and tm_mon > 12. + (__mktime_intenral): Compute year using long int arithmetic, + not int arithmetic, to avoid problems on hosts where time_t + and long are 64 bits but int is 32. + [BZ #468] Import a fix from gnulib. * time/mktime.c [! DEBUG]: Do not include <string.h>. It's needed only if DEBUG is nonzero. diff --git a/time/mktime.c b/time/mktime.c index 8f1f51e..5cd4e99 100644 --- a/time/mktime.c +++ b/time/mktime.c @@ -77,7 +77,7 @@ verify (base_year_is_a_multiple_of_100, TM_YEAR_BASE % 100 == 0); /* Return 1 if YEAR + TM_YEAR_BASE is a leap year. */ static inline int -leapyear (int year) +leapyear (long int year) { /* Don't add YEAR to TM_YEAR_BASE, as that might overflow. Also, work even if YEAR is negative. */ @@ -119,7 +119,7 @@ const unsigned short int __mon_yday[2][13] = If TP is null, return a nonzero value. If overflow occurs, yield the low order bits of the correct answer. */ static time_t -ydhms_tm_diff (int year, int yday, int hour, int min, int sec, +ydhms_tm_diff (long int year, int yday, int hour, int min, int sec, const struct tm *tp) { if (!tp) @@ -231,7 +231,8 @@ __mktime_internal (struct tm *tp, int mon_remainder = mon % 12; int negative_mon_remainder = mon_remainder < 0; int mon_years = mon / 12 - negative_mon_remainder; - int year = year_requested + mon_years; + long int lyear_requested = year_requested; + long int year = lyear_requested + mon_years; /* The other values need not be in range: the remaining code handles minor overflows correctly, |