about summary refs log tree commit diff
path: root/ChangeLog
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2018-09-19 13:16:14 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2018-09-19 17:09:08 -0700
commit8e6fd2bdb21efe2cc1ae7571ff8fb2599db6a05a (patch)
tree16623453ad42c7ad61408a410c312aae747cc4d6 /ChangeLog
parent83a552b0bb9fc2a5e80a0ab3723c0a80ce1db9f2 (diff)
downloadglibc-8e6fd2bdb21efe2cc1ae7571ff8fb2599db6a05a.tar.gz
glibc-8e6fd2bdb21efe2cc1ae7571ff8fb2599db6a05a.tar.xz
glibc-8e6fd2bdb21efe2cc1ae7571ff8fb2599db6a05a.zip
Merge mktime, timegm from upstream Gnulib
[BZ #23603][BZ #16346]
This fixes some obscure problems with integer overflow.
Although it looks scary, it is almost all a byte-for-byte copy
from Gnulib, and the Gnulib code has been tested reasonably well.
* include/intprops.h: New file, copied from Gnulib.
* include/verify.h, time/mktime-internal.h:
New tiny files, simplified from Gnulib.
* time/mktime.c: Copy from Gnulib.  This has the following changes:
Do not include config.h if DEBUG_MKTIME is nonzero.
Include stdbool.h, intprops.h, verify.h.
Include string.h only if needed.
Include stdlib.h on MS-Windows.
Include mktime-internal.h.
(DEBUG_MKTIME): Default to 0, and simplify later uses.
(NEED_MKTIME_INTERNAL, NEED_MKTIME_WINDOWS)
(NEED_MKTIME_WORKING): Give default values to pacify -Wundef,
which glibc uses.  Default NEED_MKTIME_WORKING to DEBUG_MKTIME, to
simplify later conditionals; default the others to zero.  Use
these conditionals to express only the code needed on the current
platform.  In uses of these conditionals, explicitly spell out how
_LIBC affects things, so it’s easier to review from a glibc
viewpoint.
(WRAPV): Remove; no longer needed now that we have
systematic overflow checking.
(my_tzset, __tzset) [!_LIBC]: New function and macro, to better
compartmentalize tzset issues.  Move system-dependent tzsettish
code here from mktime.
(verify): Remove; now done by verify.h.  All uses changed.
(long_int): Use a more-conservative definition, to avoid
integer overflow.
(SHR): Remove, replacing with ...
(shr): New function, which means we needn’t worry about side
effects in args, and conversion analysis is simpler.
(TYPE_IS_INTEGER, TYPE_TWOS_COMPLEMENT, TYPE_SIGNED, TYPE_MINIMUM)
(TYPE_MAXIMUM, TIME_T_MIN, TIME_T_MAX, TIME_T_MIDPOINT)
(time_t_avg, time_t_add_ok): Remove.
(mktime_min, mktime_max): New constants.
(leapyear, isdst_differ): Use bool for booleans.
(ydhms_diff, guess_time_tm, ranged_convert, __mktime_internal):
Use long_int, not time_t, for mktime differences.
(long_int_avg): New function, replacing time_t_avg.
INT_ADD_WRAPV replaces time_t_add_ok.
(guess_time_tm): 6th arg is now long_int, not time_t const *.
All uses changed.
(convert_time): New function.
(ranged_convert): Use it.
(__mktime_internal): Last arg now points to mktime_offset_t, not
time_t.  All uses changed.  This is a no-op on glibc, where
mktime_offset_t is always time_t.  Use int, not time_t, for UTC
offset guess.  Directly check for integer overflow instead of
using a heuristic that works only 99.9...% of the time.
Access *OFFSET only once, to avoid an unlikely race if the
compiler delays a load and if this cascades into a signed integer
overflow.
(mktime): Move tzsettish code to my_tzset, and move
localtime_offset to within mktime so that it doesn’t
need a separate ifdef.
(main) [DEBUG_MKTIME]: Speed up by using localtime_r
instead of localtime.
* time/timegm.c: Copy from Gnulib.  This has the following changes:
Include mktime-internal.h.
[!_LIBC]: Include config.h and time.h.  Do not include
timegm.h or time_r.h.  Make __mktime_internal a macro,
and include mktime-internal.h to get its declaration.
(timegm): Temporary is now mktime_offset_t, not time_t.
This affects only Gnulib.
Diffstat (limited to 'ChangeLog')
-rw-r--r--ChangeLog70
1 files changed, 70 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 69ee9d08ca..a49dba34ea 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,73 @@
+2018-09-19  Paul Eggert  <eggert@cs.ucla.edu>
+
+	Merge mktime, timegm from upstream Gnulib
+	[BZ #23603][BZ #16346]
+	This fixes some obscure problems with integer overflow.
+	Although it looks scary, it is almost all a byte-for-byte copy
+	from Gnulib, and the Gnulib code has been tested reasonably well.
+	* include/intprops.h: New file, copied from Gnulib.
+	* include/verify.h, time/mktime-internal.h:
+	New tiny files, simplified from Gnulib.
+	* time/mktime.c: Copy from Gnulib.  This has the following changes:
+	Do not include config.h if DEBUG_MKTIME is nonzero.
+	Include stdbool.h, intprops.h, verify.h.
+	Include string.h only if needed.
+	Include stdlib.h on MS-Windows.
+	Include mktime-internal.h.
+	(DEBUG_MKTIME): Default to 0, and simplify later uses.
+	(NEED_MKTIME_INTERNAL, NEED_MKTIME_WINDOWS)
+	(NEED_MKTIME_WORKING): Give default values to pacify -Wundef,
+	which glibc uses.  Default NEED_MKTIME_WORKING to DEBUG_MKTIME, to
+	simplify later conditionals; default the others to zero.  Use
+	these conditionals to express only the code needed on the current
+	platform.  In uses of these conditionals, explicitly spell out how
+	_LIBC affects things, so it’s easier to review from a glibc
+	viewpoint.
+	(WRAPV): Remove; no longer needed now that we have
+	systematic overflow checking.
+	(my_tzset, __tzset) [!_LIBC]: New function and macro, to better
+	compartmentalize tzset issues.  Move system-dependent tzsettish
+	code here from mktime.
+	(verify): Remove; now done by verify.h.  All uses changed.
+	(long_int): Use a more-conservative definition, to avoid
+	integer overflow.
+	(SHR): Remove, replacing with ...
+	(shr): New function, which means we needn’t worry about side
+	effects in args, and conversion analysis is simpler.
+	(TYPE_IS_INTEGER, TYPE_TWOS_COMPLEMENT, TYPE_SIGNED, TYPE_MINIMUM)
+	(TYPE_MAXIMUM, TIME_T_MIN, TIME_T_MAX, TIME_T_MIDPOINT)
+	(time_t_avg, time_t_add_ok): Remove.
+	(mktime_min, mktime_max): New constants.
+	(leapyear, isdst_differ): Use bool for booleans.
+	(ydhms_diff, guess_time_tm, ranged_convert, __mktime_internal):
+	Use long_int, not time_t, for mktime differences.
+	(long_int_avg): New function, replacing time_t_avg.
+	INT_ADD_WRAPV replaces time_t_add_ok.
+	(guess_time_tm): 6th arg is now long_int, not time_t const *.
+	All uses changed.
+	(convert_time): New function.
+	(ranged_convert): Use it.
+	(__mktime_internal): Last arg now points to mktime_offset_t, not
+	time_t.  All uses changed.  This is a no-op on glibc, where
+	mktime_offset_t is always time_t.  Use int, not time_t, for UTC
+	offset guess.  Directly check for integer overflow instead of
+	using a heuristic that works only 99.9...% of the time.
+	Access *OFFSET only once, to avoid an unlikely race if the
+	compiler delays a load and if this cascades into a signed integer
+	overflow.
+	(mktime): Move tzsettish code to my_tzset, and move
+	localtime_offset to within mktime so that it doesn’t
+	need a separate ifdef.
+	(main) [DEBUG_MKTIME]: Speed up by using localtime_r
+	instead of localtime.
+	* time/timegm.c: Copy from Gnulib.  This has the following changes:
+	Include mktime-internal.h.
+	[!_LIBC]: Include config.h and time.h.  Do not include
+	timegm.h or time_r.h.  Make __mktime_internal a macro,
+	and include mktime-internal.h to get its declaration.
+	(timegm): Temporary is now mktime_offset_t, not time_t.
+	This affects only Gnulib.
+
 2018-09-19  Wilco Dijkstra  <wdijkstr@arm.com>
 
 	[BZ #23637]