9c3fb20f79d6290371200aa8a173d886fb9a4422
[platform/upstream/diffutils.git] / lib / mktime.c
1 /* Convert a 'struct tm' to a time_t value.
2    Copyright (C) 1993-2018 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4    Contributed by Paul Eggert <eggert@twinsun.com>.
5
6    The GNU C Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU General Public
8    License as published by the Free Software Foundation; either
9    version 3 of the License, or (at your option) any later version.
10
11    The GNU C Library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    General Public License for more details.
15
16    You should have received a copy of the GNU General Public
17    License along with the GNU C Library; if not, see
18    <https://www.gnu.org/licenses/>.  */
19
20 /* The following macros influence what gets defined when this file is compiled:
21
22    Macro/expression            Which gnulib module    This compilation unit
23                                                       should define
24
25    _LIBC                       (glibc proper)         mktime
26
27    NEED_MKTIME_WORKING         mktime                 rpl_mktime
28    || NEED_MKTIME_WINDOWS
29
30    NEED_MKTIME_INTERNAL        mktime-internal        mktime_internal
31  */
32
33 #ifndef _LIBC
34 # include <libc-config.h>
35 #endif
36
37 /* Assume that leap seconds are possible, unless told otherwise.
38    If the host has a 'zic' command with a '-L leapsecondfilename' option,
39    then it supports leap seconds; otherwise it probably doesn't.  */
40 #ifndef LEAP_SECONDS_POSSIBLE
41 # define LEAP_SECONDS_POSSIBLE 1
42 #endif
43
44 #include <time.h>
45
46 #include <errno.h>
47 #include <limits.h>
48 #include <stdbool.h>
49 #include <stdlib.h>
50 #include <string.h>
51
52 #include <intprops.h>
53 #include <verify.h>
54
55 #ifndef NEED_MKTIME_INTERNAL
56 # define NEED_MKTIME_INTERNAL 0
57 #endif
58 #ifndef NEED_MKTIME_WINDOWS
59 # define NEED_MKTIME_WINDOWS 0
60 #endif
61 #ifndef NEED_MKTIME_WORKING
62 # define NEED_MKTIME_WORKING 0
63 #endif
64
65 #include "mktime-internal.h"
66
67 #if !defined _LIBC && (NEED_MKTIME_WORKING || NEED_MKTIME_WINDOWS)
68 static void
69 my_tzset (void)
70 {
71 # if NEED_MKTIME_WINDOWS
72   /* Rectify the value of the environment variable TZ.
73      There are four possible kinds of such values:
74        - Traditional US time zone names, e.g. "PST8PDT".  Syntax: see
75          <https://msdn.microsoft.com/en-us/library/90s5c885.aspx>
76        - Time zone names based on geography, that contain one or more
77          slashes, e.g. "Europe/Moscow".
78        - Time zone names based on geography, without slashes, e.g.
79          "Singapore".
80        - Time zone names that contain explicit DST rules.  Syntax: see
81          <http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03>
82      The Microsoft CRT understands only the first kind.  It produces incorrect
83      results if the value of TZ is of the other kinds.
84      But in a Cygwin environment, /etc/profile.d/tzset.sh sets TZ to a value
85      of the second kind for most geographies, or of the first kind in a few
86      other geographies.  If it is of the second kind, neutralize it.  For the
87      Microsoft CRT, an absent or empty TZ means the time zone that the user
88      has set in the Windows Control Panel.
89      If the value of TZ is of the third or fourth kind -- Cygwin programs
90      understand these syntaxes as well --, it does not matter whether we
91      neutralize it or not, since these values occur only when a Cygwin user
92      has set TZ explicitly; this case is 1. rare and 2. under the user's
93      responsibility.  */
94   const char *tz = getenv ("TZ");
95   if (tz != NULL && strchr (tz, '/') != NULL)
96     _putenv ("TZ=");
97 # elif HAVE_TZSET
98   tzset ();
99 # endif
100 }
101 # undef __tzset
102 # define __tzset() my_tzset ()
103 #endif
104
105 #if defined _LIBC || NEED_MKTIME_WORKING || NEED_MKTIME_INTERNAL
106
107 /* A signed type that can represent an integer number of years
108    multiplied by four times the number of seconds in a year.  It is
109    needed when converting a tm_year value times the number of seconds
110    in a year.  The factor of four comes because these products need
111    to be subtracted from each other, and sometimes with an offset
112    added to them, and then with another timestamp added, without
113    worrying about overflow.
114
115    Much of the code uses long_int to represent time_t values, to
116    lessen the hassle of dealing with platforms where time_t is
117    unsigned, and because long_int should suffice to represent all
118    time_t values that mktime can generate even on platforms where
119    time_t is excessively wide.  */
120
121 #if INT_MAX <= LONG_MAX / 4 / 366 / 24 / 60 / 60
122 typedef long int long_int;
123 #else
124 typedef long long int long_int;
125 #endif
126 verify (INT_MAX <= TYPE_MAXIMUM (long_int) / 4 / 366 / 24 / 60 / 60);
127
128 /* Shift A right by B bits portably, by dividing A by 2**B and
129    truncating towards minus infinity.  B should be in the range 0 <= B
130    <= LONG_INT_BITS - 2, where LONG_INT_BITS is the number of useful
131    bits in a long_int.  LONG_INT_BITS is at least 32.
132
133    ISO C99 says that A >> B is implementation-defined if A < 0.  Some
134    implementations (e.g., UNICOS 9.0 on a Cray Y-MP EL) don't shift
135    right in the usual way when A < 0, so SHR falls back on division if
136    ordinary A >> B doesn't seem to be the usual signed shift.  */
137
138 static long_int
139 shr (long_int a, int b)
140 {
141   long_int one = 1;
142   return (-one >> 1 == -1
143           ? a >> b
144           : a / (one << b) - (a % (one << b) < 0));
145 }
146
147 /* Bounds for the intersection of time_t and long_int.  */
148
149 static long_int const mktime_min
150   = ((TYPE_SIGNED (time_t) && TYPE_MINIMUM (time_t) < TYPE_MINIMUM (long_int))
151      ? TYPE_MINIMUM (long_int) : TYPE_MINIMUM (time_t));
152 static long_int const mktime_max
153   = (TYPE_MAXIMUM (long_int) < TYPE_MAXIMUM (time_t)
154      ? TYPE_MAXIMUM (long_int) : TYPE_MAXIMUM (time_t));
155
156 verify (TYPE_IS_INTEGER (time_t));
157
158 #define EPOCH_YEAR 1970
159 #define TM_YEAR_BASE 1900
160 verify (TM_YEAR_BASE % 100 == 0);
161
162 /* Is YEAR + TM_YEAR_BASE a leap year?  */
163 static bool
164 leapyear (long_int year)
165 {
166   /* Don't add YEAR to TM_YEAR_BASE, as that might overflow.
167      Also, work even if YEAR is negative.  */
168   return
169     ((year & 3) == 0
170      && (year % 100 != 0
171          || ((year / 100) & 3) == (- (TM_YEAR_BASE / 100) & 3)));
172 }
173
174 /* How many days come before each month (0-12).  */
175 #ifndef _LIBC
176 static
177 #endif
178 const unsigned short int __mon_yday[2][13] =
179   {
180     /* Normal years.  */
181     { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
182     /* Leap years.  */
183     { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
184   };
185
186
187 /* Do the values A and B differ according to the rules for tm_isdst?
188    A and B differ if one is zero and the other positive.  */
189 static bool
190 isdst_differ (int a, int b)
191 {
192   return (!a != !b) && (0 <= a) && (0 <= b);
193 }
194
195 /* Return an integer value measuring (YEAR1-YDAY1 HOUR1:MIN1:SEC1) -
196    (YEAR0-YDAY0 HOUR0:MIN0:SEC0) in seconds, assuming that the clocks
197    were not adjusted between the timestamps.
198
199    The YEAR values uses the same numbering as TP->tm_year.  Values
200    need not be in the usual range.  However, YEAR1 - YEAR0 must not
201    overflow even when multiplied by three times the number of seconds
202    in a year, and likewise for YDAY1 - YDAY0 and three times the
203    number of seconds in a day.  */
204
205 static long_int
206 ydhms_diff (long_int year1, long_int yday1, int hour1, int min1, int sec1,
207             int year0, int yday0, int hour0, int min0, int sec0)
208 {
209   verify (-1 / 2 == 0);
210
211   /* Compute intervening leap days correctly even if year is negative.
212      Take care to avoid integer overflow here.  */
213   int a4 = shr (year1, 2) + shr (TM_YEAR_BASE, 2) - ! (year1 & 3);
214   int b4 = shr (year0, 2) + shr (TM_YEAR_BASE, 2) - ! (year0 & 3);
215   int a100 = a4 / 25 - (a4 % 25 < 0);
216   int b100 = b4 / 25 - (b4 % 25 < 0);
217   int a400 = shr (a100, 2);
218   int b400 = shr (b100, 2);
219   int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);
220
221   /* Compute the desired time without overflowing.  */
222   long_int years = year1 - year0;
223   long_int days = 365 * years + yday1 - yday0 + intervening_leap_days;
224   long_int hours = 24 * days + hour1 - hour0;
225   long_int minutes = 60 * hours + min1 - min0;
226   long_int seconds = 60 * minutes + sec1 - sec0;
227   return seconds;
228 }
229
230 /* Return the average of A and B, even if A + B would overflow.
231    Round toward positive infinity.  */
232 static long_int
233 long_int_avg (long_int a, long_int b)
234 {
235   return shr (a, 1) + shr (b, 1) + ((a | b) & 1);
236 }
237
238 /* Return a long_int value corresponding to (YEAR-YDAY HOUR:MIN:SEC)
239    minus *TP seconds, assuming no clock adjustments occurred between
240    the two timestamps.
241
242    YEAR and YDAY must not be so large that multiplying them by three times the
243    number of seconds in a year (or day, respectively) would overflow long_int.
244    *TP should be in the usual range.  */
245 static long_int
246 tm_diff (long_int year, long_int yday, int hour, int min, int sec,
247          struct tm const *tp)
248 {
249   return ydhms_diff (year, yday, hour, min, sec,
250                      tp->tm_year, tp->tm_yday,
251                      tp->tm_hour, tp->tm_min, tp->tm_sec);
252 }
253
254 /* Use CONVERT to convert T to a struct tm value in *TM.  T must be in
255    range for time_t.  Return TM if successful, NULL (setting errno) on
256    failure.  */
257 static struct tm *
258 convert_time (struct tm *(*convert) (const time_t *, struct tm *),
259               long_int t, struct tm *tm)
260 {
261   time_t x = t;
262   return convert (&x, tm);
263 }
264
265 /* Use CONVERT to convert *T to a broken down time in *TP.
266    If *T is out of range for conversion, adjust it so that
267    it is the nearest in-range value and then convert that.
268    A value is in range if it fits in both time_t and long_int.
269    Return TP on success, NULL (setting errno) on failure.  */
270 static struct tm *
271 ranged_convert (struct tm *(*convert) (const time_t *, struct tm *),
272                 long_int *t, struct tm *tp)
273 {
274   long_int t1 = (*t < mktime_min ? mktime_min
275                  : *t <= mktime_max ? *t : mktime_max);
276   struct tm *r = convert_time (convert, t1, tp);
277   if (r)
278     {
279       *t = t1;
280       return r;
281     }
282   if (errno != EOVERFLOW)
283     return NULL;
284
285   long_int bad = t1;
286   long_int ok = 0;
287   struct tm oktm; oktm.tm_sec = -1;
288
289   /* BAD is a known out-of-range value, and OK is a known in-range one.
290      Use binary search to narrow the range between BAD and OK until
291      they differ by 1.  */
292   while (true)
293     {
294       long_int mid = long_int_avg (ok, bad);
295       if (mid == ok || mid == bad)
296         break;
297       if (convert_time (convert, mid, tp))
298         ok = mid, oktm = *tp;
299       else if (errno != EOVERFLOW)
300         return NULL;
301       else
302         bad = mid;
303     }
304
305   if (oktm.tm_sec < 0)
306     return NULL;
307   *t = ok;
308   *tp = oktm;
309   return tp;
310 }
311
312
313 /* Convert *TP to a time_t value, inverting
314    the monotonic and mostly-unit-linear conversion function CONVERT.
315    Use *OFFSET to keep track of a guess at the offset of the result,
316    compared to what the result would be for UTC without leap seconds.
317    If *OFFSET's guess is correct, only one CONVERT call is needed.
318    If successful, set *TP to the canonicalized struct tm;
319    otherwise leave *TP alone, return ((time_t) -1) and set errno.
320    This function is external because it is used also by timegm.c.  */
321 time_t
322 __mktime_internal (struct tm *tp,
323                    struct tm *(*convert) (const time_t *, struct tm *),
324                    mktime_offset_t *offset)
325 {
326   struct tm tm;
327
328   /* The maximum number of probes (calls to CONVERT) should be enough
329      to handle any combinations of time zone rule changes, solar time,
330      leap seconds, and oscillations around a spring-forward gap.
331      POSIX.1 prohibits leap seconds, but some hosts have them anyway.  */
332   int remaining_probes = 6;
333
334   /* Time requested.  Copy it in case CONVERT modifies *TP; this can
335      occur if TP is localtime's returned value and CONVERT is localtime.  */
336   int sec = tp->tm_sec;
337   int min = tp->tm_min;
338   int hour = tp->tm_hour;
339   int mday = tp->tm_mday;
340   int mon = tp->tm_mon;
341   int year_requested = tp->tm_year;
342   int isdst = tp->tm_isdst;
343
344   /* 1 if the previous probe was DST.  */
345   int dst2 = 0;
346
347   /* Ensure that mon is in range, and set year accordingly.  */
348   int mon_remainder = mon % 12;
349   int negative_mon_remainder = mon_remainder < 0;
350   int mon_years = mon / 12 - negative_mon_remainder;
351   long_int lyear_requested = year_requested;
352   long_int year = lyear_requested + mon_years;
353
354   /* The other values need not be in range:
355      the remaining code handles overflows correctly.  */
356
357   /* Calculate day of year from year, month, and day of month.
358      The result need not be in range.  */
359   int mon_yday = ((__mon_yday[leapyear (year)]
360                    [mon_remainder + 12 * negative_mon_remainder])
361                   - 1);
362   long_int lmday = mday;
363   long_int yday = mon_yday + lmday;
364
365   mktime_offset_t off = *offset;
366   int negative_offset_guess;
367
368   int sec_requested = sec;
369
370   if (LEAP_SECONDS_POSSIBLE)
371     {
372       /* Handle out-of-range seconds specially,
373          since ydhms_diff assumes every minute has 60 seconds.  */
374       if (sec < 0)
375         sec = 0;
376       if (59 < sec)
377         sec = 59;
378     }
379
380   /* Invert CONVERT by probing.  First assume the same offset as last
381      time.  */
382
383   INT_SUBTRACT_WRAPV (0, off, &negative_offset_guess);
384   long_int t0 = ydhms_diff (year, yday, hour, min, sec,
385                             EPOCH_YEAR - TM_YEAR_BASE, 0, 0, 0,
386                             negative_offset_guess);
387   long_int t = t0, t1 = t0, t2 = t0;
388
389   /* Repeatedly use the error to improve the guess.  */
390
391   while (true)
392     {
393       if (! ranged_convert (convert, &t, &tm))
394         return -1;
395       long_int dt = tm_diff (year, yday, hour, min, sec, &tm);
396       if (dt == 0)
397         break;
398
399       if (t == t1 && t != t2
400           && (tm.tm_isdst < 0
401               || (isdst < 0
402                   ? dst2 <= (tm.tm_isdst != 0)
403                   : (isdst != 0) != (tm.tm_isdst != 0))))
404         /* We can't possibly find a match, as we are oscillating
405            between two values.  The requested time probably falls
406            within a spring-forward gap of size DT.  Follow the common
407            practice in this case, which is to return a time that is DT
408            away from the requested time, preferring a time whose
409            tm_isdst differs from the requested value.  (If no tm_isdst
410            was requested and only one of the two values has a nonzero
411            tm_isdst, prefer that value.)  In practice, this is more
412            useful than returning -1.  */
413         goto offset_found;
414
415       remaining_probes--;
416       if (remaining_probes == 0)
417         {
418           __set_errno (EOVERFLOW);
419           return -1;
420         }
421
422       t1 = t2, t2 = t, t += dt, dst2 = tm.tm_isdst != 0;
423     }
424
425   /* We have a match.  Check whether tm.tm_isdst has the requested
426      value, if any.  */
427   if (isdst_differ (isdst, tm.tm_isdst))
428     {
429       /* tm.tm_isdst has the wrong value.  Look for a neighboring
430          time with the right value, and use its UTC offset.
431
432          Heuristic: probe the adjacent timestamps in both directions,
433          looking for the desired isdst.  This should work for all real
434          time zone histories in the tz database.  */
435
436       /* Distance between probes when looking for a DST boundary.  In
437          tzdata2003a, the shortest period of DST is 601200 seconds
438          (e.g., America/Recife starting 2000-10-08 01:00), and the
439          shortest period of non-DST surrounded by DST is 694800
440          seconds (Africa/Tunis starting 1943-04-17 01:00).  Use the
441          minimum of these two values, so we don't miss these short
442          periods when probing.  */
443       int stride = 601200;
444
445       /* The longest period of DST in tzdata2003a is 536454000 seconds
446          (e.g., America/Jujuy starting 1946-10-01 01:00).  The longest
447          period of non-DST is much longer, but it makes no real sense
448          to search for more than a year of non-DST, so use the DST
449          max.  */
450       int duration_max = 536454000;
451
452       /* Search in both directions, so the maximum distance is half
453          the duration; add the stride to avoid off-by-1 problems.  */
454       int delta_bound = duration_max / 2 + stride;
455
456       int delta, direction;
457
458       for (delta = stride; delta < delta_bound; delta += stride)
459         for (direction = -1; direction <= 1; direction += 2)
460           {
461             long_int ot;
462             if (! INT_ADD_WRAPV (t, delta * direction, &ot))
463               {
464                 struct tm otm;
465                 if (! ranged_convert (convert, &ot, &otm))
466                   return -1;
467                 if (! isdst_differ (isdst, otm.tm_isdst))
468                   {
469                     /* We found the desired tm_isdst.
470                        Extrapolate back to the desired time.  */
471                     long_int gt = ot + tm_diff (year, yday, hour, min, sec,
472                                                 &otm);
473                     if (mktime_min <= gt && gt <= mktime_max)
474                       {
475                         if (convert_time (convert, gt, &tm))
476                           {
477                             t = gt;
478                             goto offset_found;
479                           }
480                         if (errno != EOVERFLOW)
481                           return -1;
482                       }
483                   }
484               }
485           }
486
487       __set_errno (EOVERFLOW);
488       return -1;
489     }
490
491  offset_found:
492   /* Set *OFFSET to the low-order bits of T - T0 - NEGATIVE_OFFSET_GUESS.
493      This is just a heuristic to speed up the next mktime call, and
494      correctness is unaffected if integer overflow occurs here.  */
495   INT_SUBTRACT_WRAPV (t, t0, offset);
496   INT_SUBTRACT_WRAPV (*offset, negative_offset_guess, offset);
497
498   if (LEAP_SECONDS_POSSIBLE && sec_requested != tm.tm_sec)
499     {
500       /* Adjust time to reflect the tm_sec requested, not the normalized value.
501          Also, repair any damage from a false match due to a leap second.  */
502       long_int sec_adjustment = sec == 0 && tm.tm_sec == 60;
503       sec_adjustment -= sec;
504       sec_adjustment += sec_requested;
505       if (INT_ADD_WRAPV (t, sec_adjustment, &t)
506           || ! (mktime_min <= t && t <= mktime_max))
507         {
508           __set_errno (EOVERFLOW);
509           return -1;
510         }
511       if (! convert_time (convert, t, &tm))
512         return -1;
513     }
514
515   *tp = tm;
516   return t;
517 }
518
519 #endif /* _LIBC || NEED_MKTIME_WORKING || NEED_MKTIME_INTERNAL */
520
521 #if defined _LIBC || NEED_MKTIME_WORKING || NEED_MKTIME_WINDOWS
522
523 /* Convert *TP to a time_t value.  */
524 time_t
525 mktime (struct tm *tp)
526 {
527   /* POSIX.1 8.1.1 requires that whenever mktime() is called, the
528      time zone names contained in the external variable 'tzname' shall
529      be set as if the tzset() function had been called.  */
530   __tzset ();
531
532 # if defined _LIBC || NEED_MKTIME_WORKING
533   static mktime_offset_t localtime_offset;
534   return __mktime_internal (tp, __localtime_r, &localtime_offset);
535 # else
536 #  undef mktime
537   return mktime (tp);
538 # endif
539 }
540 #endif /* _LIBC || NEED_MKTIME_WORKING || NEED_MKTIME_WINDOWS */
541
542 #ifdef weak_alias
543 weak_alias (mktime, timelocal)
544 #endif
545
546 #ifdef _LIBC
547 libc_hidden_def (mktime)
548 libc_hidden_weak (timelocal)
549 #endif