Module Name: src
Committed By: christos
Date: Thu Oct 16 17:53:32 UTC 2014
Modified Files:
src/lib/libc/time: localtime.c
Log Message:
- don't leak errno in mktime()
- when we load a new timezone, don't change anything unless the load succeeded.
To generate a diff of this commit:
cvs rdiff -u -r1.89 -r1.90 src/lib/libc/time/localtime.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libc/time/localtime.c
diff -u src/lib/libc/time/localtime.c:1.89 src/lib/libc/time/localtime.c:1.90
--- src/lib/libc/time/localtime.c:1.89 Wed Oct 15 11:13:45 2014
+++ src/lib/libc/time/localtime.c Thu Oct 16 13:53:32 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: localtime.c,v 1.89 2014/10/15 15:13:45 christos Exp $ */
+/* $NetBSD: localtime.c,v 1.90 2014/10/16 17:53:32 christos Exp $ */
/*
** This file is in the public domain, so clarified as of
@@ -10,7 +10,7 @@
#if 0
static char elsieid[] = "@(#)localtime.c 8.17";
#else
-__RCSID("$NetBSD: localtime.c,v 1.89 2014/10/15 15:13:45 christos Exp $");
+__RCSID("$NetBSD: localtime.c,v 1.90 2014/10/16 17:53:32 christos Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
@@ -1234,18 +1234,19 @@ tzsetlcl(char const *name)
if (lcl < 0 ? lcl_is_set < 0
: 0 < lcl_is_set && strcmp(lcl_TZname, name) == 0)
return;
- if (0 < lcl)
- (void)strcpy(lcl_TZname, name);
- if (! lclptr) {
- struct state *sp = malloc(sizeof *lclptr);
- if (!zoneinit(sp, name)) {
- free(sp);
- return;
- }
- lclptr = sp;
+ if (!lclptr && !(lclptr = malloc(sizeof *lclptr)))
+ return;
+
+ if (!zoneinit(lclptr, name)) {
+ free(lclptr);
+ lclptr = NULL;
+ return;
}
+
settzname();
+ if (0 < lcl)
+ (void)strcpy(lcl_TZname, name);
lcl_is_set = lcl;
}
@@ -1432,8 +1433,6 @@ localtime_tzset(time_t const *timep, str
tzset_unlocked();
tmp = localsub(lclptr, timep, setname, tmp);
rwlock_unlock(&lcl_lock);
- if (tmp == NULL)
- errno = EOVERFLOW;
return tmp;
}
@@ -1487,12 +1486,7 @@ struct tm *
gmtime_r(const time_t * const timep, struct tm *tmp)
{
gmtcheck();
- tmp = gmtsub(NULL, timep, 0, tmp);
-
- if (tmp == NULL)
- errno = EOVERFLOW;
-
- return tmp;
+ return gmtsub(NULL, timep, 0, tmp);
}
#ifdef STD_INSPIRED
@@ -1500,27 +1494,15 @@ gmtime_r(const time_t * const timep, str
struct tm *
offtime(const time_t *const timep, long offset)
{
- struct tm *tmp;
-
gmtcheck();
- tmp = gmtsub(gmtptr, timep, (int_fast32_t)offset, &tm);
-
- if (tmp == NULL)
- errno = EOVERFLOW;
-
- return tmp;
+ return gmtsub(gmtptr, timep, (int_fast32_t)offset, &tm);
}
struct tm *
offtime_r(const time_t *timep, long offset, struct tm *tmp)
{
gmtcheck();
- tmp = gmtsub(NULL, timep, (int_fast32_t)offset, tmp);
-
- if (tmp == NULL)
- errno = EOVERFLOW;
-
- return tmp;
+ return gmtsub(NULL, timep, (int_fast32_t)offset, tmp);
}
#endif /* defined STD_INSPIRED */
@@ -1632,7 +1614,7 @@ timesub(time_t const *timep, int_fast32_
}
tmp->tm_year = y;
if (increment_overflow(&tmp->tm_year, -TM_YEAR_BASE))
- return NULL;
+ goto overflow;
tmp->tm_yday = idays;
/*
** The "extra" mods below avoid overflow problems.
@@ -2078,6 +2060,7 @@ time1(struct tm *const tmp,
int sameind, otherind;
int i;
int nseen;
+ int save_errno;
char seen[TZ_MAX_TYPES];
unsigned char types[TZ_MAX_TYPES];
bool okay;
@@ -2088,9 +2071,12 @@ time1(struct tm *const tmp,
}
if (tmp->tm_isdst > 1)
tmp->tm_isdst = 1;
+ save_errno = errno;
t = time2(tmp, funcp, sp, offset, &okay);
- if (okay)
+ if (okay) {
+ errno = save_errno;
return t;
+ }
if (tmp->tm_isdst < 0)
#ifdef PCTS
/*
@@ -2130,8 +2116,10 @@ time1(struct tm *const tmp,
sp->ttis[samei].tt_gmtoff);
tmp->tm_isdst = !tmp->tm_isdst;
t = time2(tmp, funcp, sp, offset, &okay);
- if (okay)
+ if (okay) {
+ errno = save_errno;
return t;
+ }
tmp->tm_sec -= (int)(sp->ttis[otheri].tt_gmtoff -
sp->ttis[samei].tt_gmtoff);
tmp->tm_isdst = !tmp->tm_isdst;