* Makefile.in (localtime_CFLAGS): Define as -fwrapv since localtime

code requires int overflows to be fully defined.
	* localtime.cc: Align a bit more to upstream code.
This commit is contained in:
Corinna Vinschen 2013-05-14 13:34:05 +00:00
parent ccd40e46d7
commit b39bb1802a
3 changed files with 26 additions and 43 deletions

View File

@ -1,3 +1,9 @@
2013-05-14 Corinna Vinschen <corinna@vinschen.de>
* Makefile.in (localtime_CFLAGS): Define as -fwrapv since localtime
code requires int overflows to be fully defined.
* localtime.cc: Align a bit more to upstream code.
2013-05-14 Corinna Vinschen <corinna@vinschen.de> 2013-05-14 Corinna Vinschen <corinna@vinschen.de>
* grp.cc (get_groups): Convert to void function. * grp.cc (get_groups): Convert to void function.

View File

@ -303,6 +303,7 @@ fhandler_zero_CFLAGS:=-fomit-frame-pointer
flock_CFLAGS:=-fomit-frame-pointer flock_CFLAGS:=-fomit-frame-pointer
grp_CFLAGS:=-fomit-frame-pointer grp_CFLAGS:=-fomit-frame-pointer
libstdcxx_wrapper_CFLAGS:=-fomit-frame-pointer libstdcxx_wrapper_CFLAGS:=-fomit-frame-pointer
localtime_CFLAGS:=-fwrapv
malloc_CFLAGS:=-fomit-frame-pointer -O3 malloc_CFLAGS:=-fomit-frame-pointer -O3
malloc_wrapper_CFLAGS:=-fomit-frame-pointer malloc_wrapper_CFLAGS:=-fomit-frame-pointer
miscfuncs_CFLAGS:=-fomit-frame-pointer miscfuncs_CFLAGS:=-fomit-frame-pointer

View File

@ -8,7 +8,7 @@
/* /*
** This file is in the public domain, so clarified as of ** This file is in the public domain, so clarified as of
** 1996-06-05 by Arthur David Olson (arthur_david_olson@nih.gov). ** 1996-06-05 by Arthur David Olson.
*/ */
/* Temporarily merged private.h and tzfile.h for ease of management - DJ */ /* Temporarily merged private.h and tzfile.h for ease of management - DJ */
@ -23,14 +23,13 @@
#ifndef lint #ifndef lint
#ifndef NOID #ifndef NOID
static char elsieid[] = "@(#)localtime.c 7.66"; static char elsieid[] = "@(#)localtime.c 8.17";
#endif /* !defined NOID */ #endif /* !defined NOID */
#endif /* !defined lint */ #endif /* !defined lint */
/* /*
** Leap second handling from Bradley White (bww@k.gp.cs.cmu.edu). ** Leap second handling from Bradley White.
** POSIX-style TZ environment variable handling from Guy Harris ** POSIX-style TZ environment variable handling from Guy Harris.
** (guy@auspex.com).
*/ */
#define NO_ERROR_IN_DST_GAP #define NO_ERROR_IN_DST_GAP
@ -171,7 +170,7 @@ static char privatehid[] = "@(#)private.h 7.48";
/* /*
** This file is in the public domain, so clarified as of ** This file is in the public domain, so clarified as of
** 1996-06-05 by Arthur David Olson (arthur_david_olson@nih.gov). ** 1996-06-05 by Arthur David Olson.
*/ */
/* /*
@ -273,7 +272,7 @@ struct tzhead {
** 138 years of Pacific Presidential Election time ** 138 years of Pacific Presidential Election time
** (where there are three time zone transitions every fourth year). ** (where there are three time zone transitions every fourth year).
*/ */
#define TZ_MAX_TIMES 370 #define TZ_MAX_TIMES 1200
#endif /* !defined TZ_MAX_TIMES */ #endif /* !defined TZ_MAX_TIMES */
#ifndef TZ_MAX_TYPES #ifndef TZ_MAX_TYPES
@ -283,7 +282,7 @@ struct tzhead {
#ifdef NOSOLAR #ifdef NOSOLAR
/* /*
** Must be at least 14 for Europe/Riga as of Jan 12 1995, ** Must be at least 14 for Europe/Riga as of Jan 12 1995,
** as noted by Earl Chew <earl@hpato.aus.hp.com>. ** as noted by Earl Chew.
*/ */
#define TZ_MAX_TYPES 20 /* Maximum number of local time types */ #define TZ_MAX_TYPES 20 /* Maximum number of local time types */
#endif /* !defined NOSOLAR */ #endif /* !defined NOSOLAR */
@ -341,28 +340,6 @@ struct tzhead {
#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0)) #define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
#ifndef USG
/*
** Use of the underscored variants may cause problems if you move your code to
** certain System-V-based systems; for maximum portability, use the
** underscore-free variants. The underscored variants are provided for
** backward compatibility only; they may disappear from future versions of
** this file.
*/
#define SECS_PER_MIN SECSPERMIN
#define MINS_PER_HOUR MINSPERHOUR
#define HOURS_PER_DAY HOURSPERDAY
#define DAYS_PER_WEEK DAYSPERWEEK
#define DAYS_PER_NYEAR DAYSPERNYEAR
#define DAYS_PER_LYEAR DAYSPERLYEAR
#define SECS_PER_HOUR SECSPERHOUR
#define SECS_PER_DAY SECSPERDAY
#define MONS_PER_YEAR MONSPERYEAR
#endif /* !defined USG */
#endif /* !defined TZFILE_H */ #endif /* !defined TZFILE_H */
#include "fcntl.h" #include "fcntl.h"
@ -517,7 +494,7 @@ static int tzload(timezone_t sp, const char * name,
static int tzparse(timezone_t sp, const char * name, static int tzparse(timezone_t sp, const char * name,
int lastditch); int lastditch);
static void tzset_unlocked(void); static void tzset_unlocked(void);
static long leapcorr(time_t * timep); static long leapcorr(const timezone_t sp, time_t * timep);
static timezone_t lclptr; static timezone_t lclptr;
static timezone_t gmtptr; static timezone_t gmtptr;
@ -622,11 +599,11 @@ settzname (void)
#ifdef USG_COMPAT #ifdef USG_COMPAT
if (ttisp->tt_isdst) if (ttisp->tt_isdst)
daylight = 1; daylight = 1;
if (i == 0 || !ttisp->tt_isdst) if (!ttisp->tt_isdst)
timezone = -(ttisp->tt_gmtoff); timezone = -(ttisp->tt_gmtoff);
#endif /* defined USG_COMPAT */ #endif /* defined USG_COMPAT */
#ifdef ALTZONE #ifdef ALTZONE
if (i == 0 || ttisp->tt_isdst) if (ttisp->tt_isdst)
altzone = -(ttisp->tt_gmtoff); altzone = -(ttisp->tt_gmtoff);
#endif /* defined ALTZONE */ #endif /* defined ALTZONE */
} }
@ -1523,6 +1500,7 @@ tzsetwall (void)
lcl_is_set = lcl_setting; lcl_is_set = lcl_setting;
if (lclptr == NULL) { if (lclptr == NULL) {
save_errno save;
lclptr = (timezone_t) calloc(1, sizeof *lclptr); lclptr = (timezone_t) calloc(1, sizeof *lclptr);
if (lclptr == NULL) { if (lclptr == NULL) {
settzname(); /* all we can do */ settzname(); /* all we can do */
@ -1632,11 +1610,11 @@ tzset_unlocked(void)
return; return;
} }
if (lcl_is_set > 0 && strncmp(lcl_TZname, name, sizeof(lcl_TZname) - 1) == 0) if (lcl_is_set > 0 && strcmp(lcl_TZname, name) == 0)
return; return;
lcl_is_set = (strlen(name) < sizeof (lcl_TZname)) ? lcl_from_environment : lcl_unset; lcl_is_set = (strlen(name) < sizeof (lcl_TZname)) ? lcl_from_environment : lcl_unset;
if (lcl_is_set != lcl_unset) if (lcl_is_set != lcl_unset)
strlcpy(lcl_TZname, name, sizeof (lcl_TZname)); (void)strlcpy(lcl_TZname, name, sizeof (lcl_TZname));
if (lclptr == NULL) { if (lclptr == NULL) {
save_errno save; save_errno save;
@ -2490,13 +2468,11 @@ gtime(struct tm *const tmp)
*/ */
static long static long
leapcorr(time_t *timep) leapcorr(const timezone_t sp, time_t *timep)
{ {
timezone_t sp;
struct lsinfo * lp; struct lsinfo * lp;
int i; int i;
sp = lclptr;
i = sp->leapcnt; i = sp->leapcnt;
while (--i >= 0) { while (--i >= 0) {
lp = &sp->lsis[i]; lp = &sp->lsis[i];
@ -2512,7 +2488,7 @@ time2posix(time_t t)
time_t result; time_t result;
tzset_guard.init ("tzset_guard")->acquire (); tzset_guard.init ("tzset_guard")->acquire ();
tzset_unlocked(); tzset_unlocked();
result = t - leapcorr(&t); result = t - leapcorr(lclptr, &t);
tzset_guard.release (); tzset_guard.release ();
return (result); return (result);
} }
@ -2531,12 +2507,12 @@ posix2time(time_t t)
** hit, the corresponding time doesn't exist, ** hit, the corresponding time doesn't exist,
** so we return an adjacent second. ** so we return an adjacent second.
*/ */
x = (time_t)(t + leapcorr(&t)); x = (time_t)(t + leapcorr(lclptr, &t));
y = (time_t)(x - leapcorr(&x)); y = (time_t)(x - leapcorr(lclptr, &x));
if (y < t) { if (y < t) {
do { do {
x++; x++;
y = (time_t)(x - leapcorr(&x)); y = (time_t)(x - leapcorr(lclptr, &x));
} while (y < t); } while (y < t);
if (t != y) { if (t != y) {
return x - 1; return x - 1;
@ -2544,7 +2520,7 @@ posix2time(time_t t)
} else if (y > t) { } else if (y > t) {
do { do {
--x; --x;
y = (time_t)(x - leapcorr(&x)); y = (time_t)(x - leapcorr(lclptr, &x));
} while (y > t); } while (y > t);
if (t != y) { if (t != y) {
return x + 1; return x + 1;