2626#ifndef WILDABBR
2727/*
2828 * Someone might make incorrect use of a time zone abbreviation:
29- *1. They might reference tzname[0] before calling tzset (explicitly
29+ *1. They might reference tzname[0] before calling tzset (explicitly
3030 *or implicitly).
31- *2. They might reference tzname[1] before calling tzset (explicitly
31+ *2. They might reference tzname[1] before calling tzset (explicitly
3232 *or implicitly).
33- *3. They might reference tzname[1] after setting to a time zone
33+ *3. They might reference tzname[1] after setting to a time zone
3434 *in which Daylight Saving Time is never observed.
35- *4. They might reference tzname[0] after setting to a time zone
35+ *4. They might reference tzname[0] after setting to a time zone
3636 *in which Standard Time is never observed.
37- *5. They might reference tm.TM_ZONE after calling offtime.
37+ *5. They might reference tm.TM_ZONE after calling offtime.
3838 * What's best to do in the above cases is open to debate;
3939 * for now, we just set things up so that in any of the five cases
4040 * WILDABBR is used. Another possibility: initialize tzname[0] to the
4444 * that tzname[0] has the "normal" length of three characters).
4545 */
4646#define WILDABBR " "
47- #endif /* !defined WILDABBR */
47+ #endif /* !defined WILDABBR */
4848
4949static const char wildabbr []= WILDABBR ;
5050
5151static const char gmt []= "GMT" ;
5252
53- /* The minimum and maximum finite time values. This assumes no padding. */
54- static const pg_time_t time_t_min = MINVAL (pg_time_t ,TYPE_BIT (pg_time_t ));
55- static const pg_time_t time_t_max = MAXVAL (pg_time_t ,TYPE_BIT (pg_time_t ));
56-
5753/*
58- * We cache the result of trying to load the TZDEFRULES zone here.
54+ *PG: We cache the result of trying to load the TZDEFRULES zone here.
5955 * tzdefrules_loaded is 0 if not tried yet, +1 if good, -1 if failed.
6056 */
6157static struct state tzdefrules_s ;
6258static int tzdefrules_loaded = 0 ;
6359
6460/*
6561 * The DST rules to use if TZ has no rules and we can't load TZDEFRULES.
66- *We default to US rules as of1999-08-17 .
62+ *Default to US rules as of2017-05-07 .
6763 * POSIX 1003.1 section 8.1.1 says that the default DST rules are
6864 * implementation dependent; for historical reasons, US rules are a
6965 * common default.
7066 */
71- #define TZDEFRULESTRING ",M4.1 .0,M10.5 .0"
67+ #define TZDEFRULESTRING ",M3.2 .0,M11.1 .0"
7268
7369/* structs ttinfo, lsinfo, state have been moved to pgtz.h */
7470
@@ -112,7 +108,7 @@ static struct pg_tm tm;
112108
113109/* Initialize *S to a value based on GMTOFF, ISDST, and ABBRIND. */
114110static void
115- init_ttinfo (struct ttinfo * s ,int32 gmtoff ,bool isdst ,int abbrind )
111+ init_ttinfo (struct ttinfo * s ,int32 gmtoff ,bool isdst ,int abbrind )
116112{
117113s -> tt_gmtoff = gmtoff ;
118114s -> tt_isdst = isdst ;
@@ -189,23 +185,23 @@ union input_buffer
189185
190186/* The entire buffer. */
191187char buf [2 * sizeof (struct tzhead )+ 2 * sizeof (struct state )
192- + 4 * TZ_MAX_TIMES ];
188+ + 4 * TZ_MAX_TIMES ];
193189};
194190
195191/* Local storage needed for 'tzloadbody'. */
196192union local_storage
197193{
198- /* We don't need the "fullname" member */
199-
200194/* The results of analyzing the file's contents after it is opened. */
201- struct
195+ struct file_analysis
202196{
203197/* The input buffer. */
204198union input_buffer u ;
205199
206200/* A temporary state used for parsing a TZ string in the file. */
207201struct state st ;
208202}u ;
203+
204+ /* We don't need the "fullname" member */
209205};
210206
211207/* Load tz data from the file named NAME into *SP. Read extended
@@ -215,8 +211,8 @@ union local_storage
215211 * given name is stored there (the buffer must be > TZ_STRLEN_MAX bytes!).
216212 */
217213static int
218- tzloadbody (char const * name ,char * canonname ,struct state * sp ,bool doextend ,
219- union local_storage * lsp )
214+ tzloadbody (char const * name ,char * canonname ,struct state * sp ,bool doextend ,
215+ union local_storage * lsp )
220216{
221217int i ;
222218int fid ;
@@ -255,6 +251,8 @@ tzloadbody(char const * name, char *canonname, struct state * sp, bool doextend,
255251{
256252int32 ttisstdcnt = detzcode (up -> tzhead .tzh_ttisstdcnt );
257253int32 ttisgmtcnt = detzcode (up -> tzhead .tzh_ttisgmtcnt );
254+ int64 prevtr = 0 ;
255+ int32 prevcorr = 0 ;
258256int32 leapcnt = detzcode (up -> tzhead .tzh_leapcnt );
259257int32 timecnt = detzcode (up -> tzhead .tzh_timecnt );
260258int32 typecnt = detzcode (up -> tzhead .tzh_typecnt );
@@ -270,7 +268,7 @@ tzloadbody(char const * name, char *canonname, struct state * sp, bool doextend,
270268return EINVAL ;
271269if (nread
272270< (tzheadsize /* struct tzhead */
273- + timecnt * stored /* ats */
271+ + timecnt * stored /* ats */
274272+ timecnt /* types */
275273+ typecnt * 6 /* ttinfos */
276274+ charcnt /* chars */
@@ -285,21 +283,21 @@ tzloadbody(char const * name, char *canonname, struct state * sp, bool doextend,
285283
286284/*
287285 * Read transitions, discarding those out of pg_time_t range. But
288- * pretend the last transition beforetime_t_min occurred at
289- *time_t_min .
286+ * pretend the last transition beforeTIME_T_MIN occurred at
287+ *TIME_T_MIN .
290288 */
291289timecnt = 0 ;
292290for (i = 0 ;i < sp -> timecnt ;++ i )
293291{
294292int64 at
295293= stored == 4 ?detzcode (p ) :detzcode64 (p );
296294
297- sp -> types [i ]= at <=time_t_max ;
295+ sp -> types [i ]= at <=TIME_T_MAX ;
298296if (sp -> types [i ])
299297{
300298pg_time_t attime
301- = ((TYPE_SIGNED (pg_time_t ) ?at < time_t_min :at < 0 )
302- ?time_t_min :at );
299+ = ((TYPE_SIGNED (pg_time_t ) ?at < TIME_T_MIN :at < 0 )
300+ ?TIME_T_MIN :at );
303301
304302if (timecnt && attime <=sp -> ats [timecnt - 1 ])
305303{
@@ -354,20 +352,22 @@ tzloadbody(char const * name, char *canonname, struct state * sp, bool doextend,
354352int32 corr = detzcode (p + stored );
355353
356354p += stored + 4 ;
357- if (tr <=time_t_max )
355+ /* Leap seconds cannot occur before the Epoch. */
356+ if (tr < 0 )
357+ return EINVAL ;
358+ if (tr <=TIME_T_MAX )
358359{
359- pg_time_t trans
360- = ((TYPE_SIGNED (pg_time_t ) ?tr < time_t_min :tr < 0 )
361- ?time_t_min :tr );
362-
363- if (leapcnt && trans <=sp -> lsis [leapcnt - 1 ].ls_trans )
364- {
365- if (trans < sp -> lsis [leapcnt - 1 ].ls_trans )
366- return EINVAL ;
367- leapcnt -- ;
368- }
369- sp -> lsis [leapcnt ].ls_trans = trans ;
370- sp -> lsis [leapcnt ].ls_corr = corr ;
360+ /*
361+ * Leap seconds cannot occur more than once per UTC month, and
362+ * UTC months are at least 28 days long (minus 1 second for a
363+ * negative leap second). Each leap second's correction must
364+ * differ from the previous one's by 1 second.
365+ */
366+ if (tr - prevtr < 28 * SECSPERDAY - 1
367+ || (corr != prevcorr - 1 && corr != prevcorr + 1 ))
368+ return EINVAL ;
369+ sp -> lsis [leapcnt ].ls_trans = prevtr = tr ;
370+ sp -> lsis [leapcnt ].ls_corr = prevcorr = corr ;
371371leapcnt ++ ;
372372}
373373}
@@ -508,7 +508,7 @@ tzloadbody(char const * name, char *canonname, struct state * sp, bool doextend,
508508}
509509
510510/*
511- * If type 0 isis unused in transitions, it's the type to use for early
511+ * If type 0 is unused in transitions, it's the type to use for early
512512 * times.
513513 */
514514for (i = 0 ;i < sp -> timecnt ;++ i )
@@ -553,7 +553,7 @@ tzloadbody(char const * name, char *canonname, struct state * sp, bool doextend,
553553 * given name is stored there (the buffer must be > TZ_STRLEN_MAX bytes!).
554554 */
555555int
556- tzload (const char * name ,char * canonname ,struct state * sp ,bool doextend )
556+ tzload (const char * name ,char * canonname ,struct state * sp ,bool doextend )
557557{
558558union local_storage * lsp = malloc (sizeof * lsp );
559559
@@ -569,7 +569,7 @@ tzload(const char *name, char *canonname, struct state * sp, bool doextend)
569569}
570570
571571static bool
572- typesequiv (const struct state * sp ,int a ,int b )
572+ typesequiv (const struct state * sp ,int a ,int b )
573573{
574574bool result ;
575575
@@ -737,7 +737,7 @@ getoffset(const char *strp, int32 *offsetp)
737737 * Otherwise, return a pointer to the first character not part of the rule.
738738 */
739739static const char *
740- getrule (const char * strp ,struct rule * rulep )
740+ getrule (const char * strp ,struct rule * rulep )
741741{
742742if (* strp == 'J' )
743743{
@@ -788,7 +788,7 @@ getrule(const char *strp, struct rule * rulep)
788788strp = getoffset (strp ,& rulep -> r_time );
789789}
790790else
791- rulep -> r_time = 2 * SECSPERHOUR ;/* default = 2:00:00 */
791+ rulep -> r_time = 2 * SECSPERHOUR ;/* default = 2:00:00 */
792792return strp ;
793793}
794794
@@ -797,7 +797,7 @@ getrule(const char *strp, struct rule * rulep)
797797 * effect, calculate the year-relative time that rule takes effect.
798798 */
799799static int32
800- transtime (int year ,const struct rule * rulep ,
800+ transtime (int year ,const struct rule * rulep ,
801801int32 offset )
802802{
803803bool leapyear ;
@@ -894,7 +894,7 @@ transtime(int year, const struct rule * rulep,
894894 * Returns true on success, false on failure.
895895 */
896896bool
897- tzparse (const char * name ,struct state * sp ,bool lastditch )
897+ tzparse (const char * name ,struct state * sp ,bool lastditch )
898898{
899899const char * stdname ;
900900const char * dstname = NULL ;
@@ -921,7 +921,7 @@ tzparse(const char *name, struct state * sp, bool lastditch)
921921stdlen = (sizeof sp -> chars )- 1 ;
922922charcnt = stdlen + 1 ;
923923stdoffset = 0 ;
924- sp -> goback = sp -> goahead = false;/* simulate failed tzload() */
924+ sp -> goback = sp -> goahead = false;/* simulate failed tzload() */
925925load_ok = false;
926926}
927927else
@@ -1217,7 +1217,7 @@ tzparse(const char *name, struct state * sp, bool lastditch)
12171217}
12181218
12191219static void
1220- gmtload (struct state * sp )
1220+ gmtload (struct state * sp )
12211221{
12221222if (tzload (gmt ,NULL ,sp , true)!= 0 )
12231223tzparse (gmt ,sp , true);
@@ -1231,8 +1231,8 @@ gmtload(struct state * sp)
12311231 * but it *is* desirable.)
12321232 */
12331233static struct pg_tm *
1234- localsub (struct state const * sp ,pg_time_t const * timep ,
1235- struct pg_tm * tmp )
1234+ localsub (struct state const * sp ,pg_time_t const * timep ,
1235+ struct pg_tm * tmp )
12361236{
12371237const struct ttinfo * ttisp ;
12381238int i ;
@@ -1323,7 +1323,7 @@ pg_localtime(const pg_time_t *timep, const pg_tz *tz)
13231323 * Except we have a private "struct state" for GMT, so no sp is passed in.
13241324 */
13251325static struct pg_tm *
1326- gmtsub (pg_time_t const * timep ,int32 offset ,struct pg_tm * tmp )
1326+ gmtsub (pg_time_t const * timep ,int32 offset ,struct pg_tm * tmp )
13271327{
13281328struct pg_tm * result ;
13291329
@@ -1361,16 +1361,23 @@ pg_gmtime(const pg_time_t *timep)
13611361 * Return the number of leap years through the end of the given year
13621362 * where, to make the math easy, the answer for year zero is defined as zero.
13631363 */
1364+ static int
1365+ leaps_thru_end_of_nonneg (int y )
1366+ {
1367+ return y /4 - y /100 + y /400 ;
1368+ }
1369+
13641370static int
13651371leaps_thru_end_of (const int y )
13661372{
1367- return (y >=0 ) ? (y /4 - y /100 + y /400 ) :
1368- - (leaps_thru_end_of (- (y + 1 ))+ 1 );
1373+ return (y < 0
1374+ ?-1 - leaps_thru_end_of_nonneg (-1 - y )
1375+ :leaps_thru_end_of_nonneg (y ));
13691376}
13701377
13711378static struct pg_tm *
13721379timesub (const pg_time_t * timep ,int32 offset ,
1373- const struct state * sp ,struct pg_tm * tmp )
1380+ const struct state * sp ,struct pg_tm * tmp )
13741381{
13751382const struct lsinfo * lp ;
13761383pg_time_t tdays ;
@@ -1390,22 +1397,9 @@ timesub(const pg_time_t *timep, int32 offset,
13901397lp = & sp -> lsis [i ];
13911398if (* timep >=lp -> ls_trans )
13921399{
1393- if (* timep == lp -> ls_trans )
1394- {
1395- hit = ((i == 0 && lp -> ls_corr > 0 )||
1396- lp -> ls_corr > sp -> lsis [i - 1 ].ls_corr );
1397- if (hit )
1398- while (i > 0 &&
1399- sp -> lsis [i ].ls_trans ==
1400- sp -> lsis [i - 1 ].ls_trans + 1 &&
1401- sp -> lsis [i ].ls_corr ==
1402- sp -> lsis [i - 1 ].ls_corr + 1 )
1403- {
1404- ++ hit ;
1405- -- i ;
1406- }
1407- }
14081400corr = lp -> ls_corr ;
1401+ hit = (* timep == lp -> ls_trans
1402+ && (i == 0 ?0 :lp [-1 ].ls_corr )< corr );
14091403break ;
14101404}
14111405}
@@ -1529,13 +1523,13 @@ increment_overflow_time(pg_time_t *tp, int32 j)
15291523{
15301524/*----------
15311525 * This is like
1532- * 'if (! (time_t_min <= *tp + j && *tp + j <=time_t_max )) ...',
1526+ * 'if (! (TIME_T_MIN <= *tp + j && *tp + j <=TIME_T_MAX )) ...',
15331527 * except that it does the right thing even if *tp + j would overflow.
15341528 *----------
15351529 */
15361530if (!(j < 0
1537- ? (TYPE_SIGNED (pg_time_t ) ?time_t_min - j <=* tp :-1 - j < * tp )
1538- :* tp <=time_t_max - j ))
1531+ ? (TYPE_SIGNED (pg_time_t ) ?TIME_T_MIN - j <=* tp :-1 - j < * tp )
1532+ :* tp <=TIME_T_MAX - j ))
15391533return true;
15401534* tp += j ;
15411535return false;