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
@@ -50,25 +50,21 @@ static 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 of 1999-08-17 .
62+ * Default to US rules as of 2017-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
@@ -195,17 +191,17 @@ union input_buffer
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. */
204198 union input_buffer u ;
205199
206200 /* A temporary state used for parsing a TZ string in the file. */
207201 struct 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
@@ -255,6 +251,8 @@ tzloadbody(char const *name, char *canonname, struct state *sp, bool doextend,
255251 {
256252 int32 ttisstdcnt = detzcode (up -> tzhead .tzh_ttisstdcnt );
257253 int32 ttisgmtcnt = detzcode (up -> tzhead .tzh_ttisgmtcnt );
254+ int64 prevtr = 0 ;
255+ int32 prevcorr = 0 ;
258256 int32 leapcnt = detzcode (up -> tzhead .tzh_leapcnt );
259257 int32 timecnt = detzcode (up -> tzhead .tzh_timecnt );
260258 int32 typecnt = detzcode (up -> tzhead .tzh_typecnt );
@@ -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 before time_t_min occurred at
289- * time_t_min .
286+ * pretend the last transition before TIME_T_MIN occurred at
287+ * TIME_T_MIN .
290288 */
291289 timecnt = 0 ;
292290 for (i = 0 ; i < sp -> timecnt ; ++ i )
293291 {
294292 int64 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 ;
298296 if (sp -> types [i ])
299297 {
300298 pg_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
304302 if (timecnt && attime <= sp -> ats [timecnt - 1 ])
305303 {
@@ -354,20 +352,22 @@ tzloadbody(char const *name, char *canonname, struct state *sp, bool doextend,
354352 int32 corr = detzcode (p + stored );
355353
356354 p += 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 ;
371371 leapcnt ++ ;
372372 }
373373 }
@@ -1361,11 +1361,18 @@ 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 *
@@ -1390,22 +1397,9 @@ timesub(const pg_time_t *timep, int32 offset,
13901397 lp = & sp -> lsis [i ];
13911398 if (* 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- }
14081400 corr = lp -> ls_corr ;
1401+ hit = (* timep == lp -> ls_trans
1402+ && (i == 0 ? 0 : lp [-1 ].ls_corr ) < corr );
14091403 break ;
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 */
15361530 if (!(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 ))
15391533 return true;
15401534 * tp += j ;
15411535 return false;
0 commit comments