about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2004-10-22 22:24:08 +0000
committerRoland McGrath <roland@gnu.org>2004-10-22 22:24:08 +0000
commit030d37152aa8e50653c4591e42ba7efe80fd1fc6 (patch)
tree6cf43ce359d379f2f4ca77e847bbb88520c88293
parent347a6c2dd8ca5208c16c9d3f32160defe7a7eda1 (diff)
downloadglibc-030d37152aa8e50653c4591e42ba7efe80fd1fc6.tar.gz
glibc-030d37152aa8e50653c4591e42ba7efe80fd1fc6.tar.xz
glibc-030d37152aa8e50653c4591e42ba7efe80fd1fc6.zip
[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--ChangeLog8
-rw-r--r--time/mktime.c7
2 files changed, 12 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 998a28b956..2059592395 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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 8f1f51e10d..5cd4e9983e 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,