This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH 8/9] mktime: avoid signed integer overflow


* time/mktime.c (__mktime_internal): Do not mishandle the case
where diff == INT_MIN.
---
 ChangeLog     |    4 ++++
 time/mktime.c |    4 ++--
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 42d9dfd..78ae054 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -118,6 +118,10 @@
 
 	* time/mktime.c (compile-command): Add "-I.".
 
+	mktime: avoid signed integer overflow
+	* time/mktime.c (__mktime_internal): Do not mishandle the case
+	where diff == INT_MIN.
+
 	mktime: simplify computation of average
 	* time/mktime.c (ranged_convert): Use new time_t_avg function
 	instead of rolling our own (probably-slower) code.
diff --git a/time/mktime.c b/time/mktime.c
index 0649f04..524e46c 100644
--- a/time/mktime.c
+++ b/time/mktime.c
@@ -445,7 +445,7 @@ __mktime_internal (struct tm *tp,
 
       int approx_biennia = SHR (t0, ALOG2_SECONDS_PER_BIENNIUM);
       int diff = approx_biennia - approx_requested_biennia;
-      int abs_diff = diff < 0 ? - diff : diff;
+      int abs_diff = diff < 0 ? -1 - diff : diff;
 
       /* IRIX 4.0.5 cc miscalculates TIME_T_MIN / 3: it erroneously
 	 gives a positive value of 715827882.  Setting a variable
@@ -463,7 +463,7 @@ __mktime_internal (struct tm *tp,
 	  time_t repaired_t0 = -1 - t0;
 	  approx_biennia = SHR (repaired_t0, ALOG2_SECONDS_PER_BIENNIUM);
 	  diff = approx_biennia - approx_requested_biennia;
-	  abs_diff = diff < 0 ? - diff : diff;
+	  abs_diff = diff < 0 ? -1 - diff : diff;
 	  if (overflow_threshold < abs_diff)
 	    return -1;
 	  guessed_offset += repaired_t0 - t0;
-- 
1.7.6.5


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]