Fix a porting bug in strftime.c, triggered on theoretical
(but conforming) hosts where 0x7fffffff is of type unsigned long.
While we’re at it, give 2**31 - 1 a name to make this problem
less likely in the future, and use the name consistently.
* private.h (TWO_31_MINUS_1): New macro.
* strftime.c (MKTIME_FITS_IN):
* zic.c (ZIC32_MIN, ZIC32_MAX, addtype): Use it.
---
private.h | 5 ++++-
strftime.c | 5 +++--
zic.c | 6 +++---
3 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/private.h b/private.h
index 55a8d548..7e1e350a 100644
--- a/private.h
+++ b/private.h
@@ -1083,7 +1083,10 @@ char *asctime_r(struct tm const *restrict, char
*restrict);
char *ctime_r(time_t const *, char *);
#endif /* HAVE_INCOMPATIBLE_CTIME_R */
-/* Handy macros that are independent of tzfile implementation. */
+/* Handy constants that are independent of tzfile implementation. */
+
+/* 2**31 - 1 as a signed integer, and usable in #if. */
+#define TWO_31_MINUS_1 2147483647
enum {
SECSPERMIN = 60,
diff --git a/strftime.c b/strftime.c
index 487a5234..c2490105 100644
--- a/strftime.c
+++ b/strftime.c
@@ -49,8 +49,9 @@
and account for the tm_year origin (1900) and time_t origin (1970). */
#define MKTIME_FITS_IN(min, max) \
((min) < 0 \
- && ((min) + 0x7fffffff) / 366 / 24 / 60 / 60 / 2 + 1970 - 1900 < INT_MIN \
- && INT_MAX < ((max) - 0x7fffffff) / 366 / 24 / 60 / 60 / 2 + 1970 - 1900)
+ && (((min) + TWO_31_MINUS_1) / 366 / 24 / 60 / 60 / 2 + 1970 - 1900 \
+ < INT_MIN) \
+ && INT_MAX < ((max) - TWO_31_MINUS_1) / 366 / 24 / 60 / 60 / 2 + 1970 -
1900)
/* MKTIME_MIGHT_OVERFLOW is true if mktime can fail due to time_t overflow
or if it is not known whether mktime can fail,
diff --git a/zic.c b/zic.c
index b69414dd..d50ad012 100644
--- a/zic.c
+++ b/zic.c
@@ -31,8 +31,8 @@ typedef int_fast64_t zic_t;
static zic_t const
ZIC_MIN = INT_FAST64_MIN,
ZIC_MAX = INT_FAST64_MAX,
- ZIC32_MIN = -1 - (zic_t) 0x7fffffff,
- ZIC32_MAX = 0x7fffffff;
+ ZIC32_MIN = -1 - (zic_t) TWO_31_MINUS_1,
+ ZIC32_MAX = TWO_31_MINUS_1;
#define SCNdZIC SCNdFAST64
#ifndef ZIC_MAX_ABBR_LEN_WO_WARN
@@ -3761,7 +3761,7 @@ addtype(zic_t utoff, char const *abbr, bool isdst, bool
ttisstd, bool ttisut)
register int i, j;
/* RFC 9636 section 3.2 specifies this range for utoff. */
- if (! (-2147483647 <= utoff && utoff <= 2147483647)) {
+ if (! (-TWO_31_MINUS_1 <= utoff && utoff <= TWO_31_MINUS_1)) {
error(_("UT offset out of range"));
exit(EXIT_FAILURE);
}
--
2.51.0