summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contrib/tzcode/stdtime/asctime.c13
-rw-r--r--contrib/tzcode/stdtime/localtime.c45
-rw-r--r--contrib/tzcode/zic/zic.85
-rw-r--r--contrib/tzcode/zic/zic.c49
4 files changed, 83 insertions, 29 deletions
diff --git a/contrib/tzcode/stdtime/asctime.c b/contrib/tzcode/stdtime/asctime.c
index 30606f1692a7..be865fb807c1 100644
--- a/contrib/tzcode/stdtime/asctime.c
+++ b/contrib/tzcode/stdtime/asctime.c
@@ -12,7 +12,7 @@
#include <sys/cdefs.h>
#ifndef lint
#ifndef NOID
-static char elsieid[] __unused = "@(#)asctime.c 8.2";
+static char elsieid[] __unused = "@(#)asctime.c 8.5";
#endif /* !defined NOID */
#endif /* !defined lint */
__FBSDID("$FreeBSD$");
@@ -95,6 +95,10 @@ char * buf;
char year[INT_STRLEN_MAXIMUM(int) + 2];
char result[MAX_ASCTIME_BUF_SIZE];
+ if (timeptr == NULL) {
+ errno = EINVAL;
+ return strcpy(buf, "??? ??? ?? ??:??:?? ????\n");
+ }
if (timeptr->tm_wday < 0 || timeptr->tm_wday >= DAYSPERWEEK)
wn = "???";
else wn = wday_name[timeptr->tm_wday];
@@ -117,10 +121,9 @@ char * buf;
timeptr->tm_mday, timeptr->tm_hour,
timeptr->tm_min, timeptr->tm_sec,
year);
- if (strlen(result) < STD_ASCTIME_BUF_SIZE || buf == buf_asctime) {
- (void) strcpy(buf, result);
- return buf;
- } else {
+ if (strlen(result) < STD_ASCTIME_BUF_SIZE || buf == buf_asctime)
+ return strcpy(buf, result);
+ else {
#ifdef EOVERFLOW
errno = EOVERFLOW;
#else /* !defined EOVERFLOW */
diff --git a/contrib/tzcode/stdtime/localtime.c b/contrib/tzcode/stdtime/localtime.c
index bee916b03f99..80b70acb9ff8 100644
--- a/contrib/tzcode/stdtime/localtime.c
+++ b/contrib/tzcode/stdtime/localtime.c
@@ -6,7 +6,7 @@
#include <sys/cdefs.h>
#ifndef lint
#ifndef NOID
-static char elsieid[] __unused = "@(#)localtime.c 8.9";
+static char elsieid[] __unused = "@(#)localtime.c 8.14";
#endif /* !defined NOID */
#endif /* !defined lint */
__FBSDID("$FreeBSD$");
@@ -315,34 +315,26 @@ settzname(void)
return;
}
#endif /* defined ALL_STATE */
+ /*
+ ** And to get the latest zone names into tzname. . .
+ */
for (i = 0; i < sp->typecnt; ++i) {
- const struct ttinfo * const ttisp = &sp->ttis[i];
+ const struct ttinfo * const ttisp = &sp->ttis[sp->types[i]];
tzname[ttisp->tt_isdst] =
&sp->chars[ttisp->tt_abbrind];
#ifdef USG_COMPAT
if (ttisp->tt_isdst)
daylight = 1;
- if (i == 0 || !ttisp->tt_isdst)
+ if (!ttisp->tt_isdst)
timezone = -(ttisp->tt_gmtoff);
#endif /* defined USG_COMPAT */
#ifdef ALTZONE
- if (i == 0 || ttisp->tt_isdst)
+ if (ttisp->tt_isdst)
altzone = -(ttisp->tt_gmtoff);
#endif /* defined ALTZONE */
}
/*
- ** And to get the latest zone names into tzname. . .
- */
- for (i = 0; i < sp->timecnt; ++i) {
- const struct ttinfo * const ttisp =
- &sp->ttis[
- sp->types[i]];
-
- tzname[ttisp->tt_isdst] =
- &sp->chars[ttisp->tt_abbrind];
- }
- /*
** Finally, scrub the abbreviations.
** First, replace bogus characters.
*/
@@ -395,6 +387,8 @@ register const int doextend;
4 * TZ_MAX_TIMES];
} u;
+ sp->goback = sp->goahead = FALSE;
+
/* XXX The following is from OpenBSD, and I'm not sure it is correct */
if (name != NULL && issetugid() != 0)
if ((name[0] == ':' && name[1] == '/') ||
@@ -610,7 +604,6 @@ register const int doextend;
sp->ttis[sp->typecnt++] = ts.ttis[1];
}
}
- sp->goback = sp->goahead = FALSE;
if (sp->timecnt > 1) {
for (i = 1; i < sp->timecnt; ++i)
if (typesequiv(sp, sp->types[i], sp->types[0]) &&
@@ -1221,7 +1214,7 @@ tzsetwall_basic(int rdlocked)
#ifdef ALL_STATE
if (lclptr == NULL) {
- lclptr = (struct state *) malloc(sizeof *lclptr);
+ lclptr = (struct state *) calloc(1, sizeof *lclptr);
if (lclptr == NULL) {
settzname(); /* all we can do */
_RWLOCK_UNLOCK(&lcl_rwlock);
@@ -1273,7 +1266,7 @@ tzset_basic(int rdlocked)
#ifdef ALL_STATE
if (lclptr == NULL) {
- lclptr = (struct state *) malloc(sizeof *lclptr);
+ lclptr = (struct state *) calloc(1, sizeof *lclptr);
if (lclptr == NULL) {
settzname(); /* all we can do */
_RWLOCK_UNLOCK(&lcl_rwlock);
@@ -1471,7 +1464,7 @@ gmt_init(void)
{
#ifdef ALL_STATE
- gmtptr = (struct state *) malloc(sizeof *gmtptr);
+ gmtptr = (struct state *) calloc(1, sizeof *gmtptr);
if (gmtptr != NULL)
#endif /* defined ALL_STATE */
gmtload(gmtptr);
@@ -2054,6 +2047,11 @@ const long offset;
int types[TZ_MAX_TYPES];
int okay;
+ if (tmp == NULL) {
+ errno = EINVAL;
+ return WRONG;
+ }
+
if (tmp->tm_isdst > 1)
tmp->tm_isdst = 1;
t = time2(tmp, funcp, offset, &okay);
@@ -2129,7 +2127,8 @@ time_t
timelocal(tmp)
struct tm * const tmp;
{
- tmp->tm_isdst = -1; /* in case it wasn't initialized */
+ if (tmp != NULL)
+ tmp->tm_isdst = -1; /* in case it wasn't initialized */
return mktime(tmp);
}
@@ -2137,7 +2136,8 @@ time_t
timegm(tmp)
struct tm * const tmp;
{
- tmp->tm_isdst = 0;
+ if (tmp != NULL)
+ tmp->tm_isdst = 0;
return time1(tmp, gmtsub, 0L);
}
@@ -2146,7 +2146,8 @@ timeoff(tmp, offset)
struct tm * const tmp;
const long offset;
{
- tmp->tm_isdst = 0;
+ if (tmp != NULL)
+ tmp->tm_isdst = 0;
return time1(tmp, gmtsub, offset);
}
diff --git a/contrib/tzcode/zic/zic.8 b/contrib/tzcode/zic/zic.8
index fe09ef224b9f..aa191314bfb6 100644
--- a/contrib/tzcode/zic/zic.8
+++ b/contrib/tzcode/zic/zic.8
@@ -119,6 +119,9 @@ Any line that is blank (after comment stripping) is ignored.
Non-blank lines are expected to be of one of three types:
rule lines, zone lines, and link lines.
.Pp
+Names (such as month names) must be in English and are case insensitive.
+Abbreviations, if used, must be unambiguous in context.
+.Pp
A rule line has the form:
.Dl "Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S"
For example:
@@ -460,6 +463,6 @@ standard directory used for created files
.Xr ctime 3 ,
.Xr tzfile 5 ,
.Xr zdump 8
-.\" @(#)zic.8 8.5
+.\" @(#)zic.8 8.6
.\" This file is in the public domain, so clarified as of
.\" 2009-05-17 by Arthur David Olson.
diff --git a/contrib/tzcode/zic/zic.c b/contrib/tzcode/zic/zic.c
index 7670056fda5d..5fb8b53c4352 100644
--- a/contrib/tzcode/zic/zic.c
+++ b/contrib/tzcode/zic/zic.c
@@ -3,7 +3,7 @@
** 2006-07-17 by Arthur David Olson.
*/
-static const char elsieid[] = "@(#)zic.c 8.20";
+static const char elsieid[] = "@(#)zic.c 8.22";
#ifndef lint
static const char rcsid[] =
@@ -1588,6 +1588,53 @@ const char * const string;
if (thistimei == 0)
writetype[0] = TRUE;
}
+#ifndef LEAVE_SOME_PRE_2011_SYSTEMS_IN_THE_LURCH
+ /*
+ ** For some pre-2011 systems: if the last-to-be-written
+ ** standard (or daylight) type has an offset different from the
+ ** most recently used offset,
+ ** append an (unused) copy of the most recently used type
+ ** (to help get global "altzone" and "timezone" variables
+ ** set correctly).
+ */
+ {
+ register int mrudst, mrustd, hidst, histd, type;
+
+ hidst = histd = mrudst = mrustd = -1;
+ for (i = thistimei; i < thistimelim; ++i)
+ if (isdsts[types[i]])
+ mrudst = types[i];
+ else mrustd = types[i];
+ for (i = 0; i < typecnt; ++i)
+ if (writetype[i]) {
+ if (isdsts[i])
+ hidst = i;
+ else histd = i;
+ }
+ if (hidst >= 0 && mrudst >= 0 && hidst != mrudst &&
+ gmtoffs[hidst] != gmtoffs[mrudst]) {
+ isdsts[mrudst] = -1;
+ type = addtype(gmtoffs[mrudst],
+ &chars[abbrinds[mrudst]],
+ TRUE,
+ ttisstds[mrudst],
+ ttisgmts[mrudst]);
+ isdsts[mrudst] = TRUE;
+ writetype[type] = TRUE;
+ }
+ if (histd >= 0 && mrustd >= 0 && histd != mrustd &&
+ gmtoffs[histd] != gmtoffs[mrustd]) {
+ isdsts[mrustd] = -1;
+ type = addtype(gmtoffs[mrustd],
+ &chars[abbrinds[mrustd]],
+ FALSE,
+ ttisstds[mrustd],
+ ttisgmts[mrustd]);
+ isdsts[mrustd] = FALSE;
+ writetype[type] = TRUE;
+ }
+ }
+#endif /* !defined LEAVE_SOME_PRE_2011_SYSTEMS_IN_THE_LURCH */
thistypecnt = 0;
for (i = 0; i < typecnt; ++i)
typemap[i] = writetype[i] ? thistypecnt++ : -1;