From 41aba3d764a72e48fa5bb08969653582c38f319f Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sat, 9 Sep 2006 16:56:29 +0000 Subject: [BZ #2821] * time/mktime.c (guess_time_tm): Fix overflow detection. * time/Makefile (tests): Add bug-mktime1. * time/bug-mktime1.c: New file. --- ChangeLog | 5 +++++ time/Makefile | 2 +- time/bug-mktime1.c | 17 +++++++++++++++++ time/mktime.c | 11 ++++++----- 4 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 time/bug-mktime1.c diff --git a/ChangeLog b/ChangeLog index 1b77fae51f..004efe9aba 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2006-09-09 Ulrich Drepper + [BZ #2821] + * time/mktime.c (guess_time_tm): Fix overflow detection. + * time/Makefile (tests): Add bug-mktime1. + * time/bug-mktime1.c: New file. + [BZ #3189, #3188] * misc/sys/mman.h (remap_file_pages): Make available for _GNU_SOURCE. (mremap): Likewise. diff --git a/time/Makefile b/time/Makefile index 734f0d5373..d93b84bb2f 100644 --- a/time/Makefile +++ b/time/Makefile @@ -35,7 +35,7 @@ distribute := datemsk tests := test_time clocktest tst-posixtz tst-strptime tst_wcsftime \ tst-getdate tst-mktime tst-mktime2 tst-ftime_l tst-strftime \ - tst-mktime3 tst-strptime2 bug-asctime bug-asctime_r + tst-mktime3 tst-strptime2 bug-asctime bug-asctime_r bug-mktime1 include ../Rules diff --git a/time/bug-mktime1.c b/time/bug-mktime1.c new file mode 100644 index 0000000000..e071273f05 --- /dev/null +++ b/time/bug-mktime1.c @@ -0,0 +1,17 @@ +#include +#include + + +static int +do_test (void) +{ + struct tm t2 = { 0, 0, 0, 1, 1, 2050 - 1900, 1, 1, 1 }; + time_t tt2 = mktime (&t2); + printf ("%ld\n", (long int) tt2); + if (sizeof (time_t) == 4 && tt2 != -1) + return 1; + return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/time/mktime.c b/time/mktime.c index 5a326d1e79..8f00c72e09 100644 --- a/time/mktime.c +++ b/time/mktime.c @@ -1,7 +1,7 @@ /* Convert a `struct tm' to a time_t value. - Copyright (C) 1993-1999, 2002-2004, 2005 Free Software Foundation, Inc. + Copyright (C) 1993-1999, 2002-2005, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. - Contributed by Paul Eggert (eggert@twinsun.com). + Contributed by Paul Eggert . The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -216,10 +216,11 @@ guess_time_tm (long int year, long int yday, int hour, int min, int sec, /* Overflow occurred one way or another. Return the nearest result that is actually in range, except don't report a zero difference if the actual difference is nonzero, as that would cause a false - match. */ + match; and don't oscillate between two values, as that would + confuse the spring-forward gap detector. */ return (*t < TIME_T_MIDPOINT - ? TIME_T_MIN + (*t == TIME_T_MIN) - : TIME_T_MAX - (*t == TIME_T_MAX)); + ? (*t <= TIME_T_MIN + 1 ? *t + 1 : TIME_T_MIN) + : (TIME_T_MAX - 1 <= *t ? *t - 1 : TIME_T_MAX)); } /* Use CONVERT to convert *T to a broken down time in *TP. -- cgit v1.2.3