This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH 13/17] mktime: avoid signed integer overflow
- From: Paul Eggert <eggert at cs dot ucla dot edu>
- To: GNU C Library <libc-alpha at sourceware dot org>
- Date: Fri, 16 Mar 2012 03:39:18 -0700
- Subject: [PATCH 13/17] 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 f1a5f9e..1bca44b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
2012-03-16 Paul Eggert <eggert@cs.ucla.edu>
+ 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 eea4fea..3775c68 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