Problem reported by Florian Weimer via a proposed glibc patch in: https://sourceware.org/pipermail/libc-alpha/2024-October/160310.html * lib/mktime.c (__mktime_internal): Ignore any tm_isdst request if the timezone never observes DST, as is the case for timegm. * m4/mktime.m4 (gl_PREREQ_MKTIME): Define new C macro __daylight if needed. --- ChangeLog | 8 ++++++++ lib/mktime.c | 4 +++- m4/mktime.m4 | 22 ++++++++++++++++++++-- 3 files changed, 31 insertions(+), 3 deletions(-)
diff --git a/ChangeLog b/ChangeLog index d8ec6067da..7a7f6dd782 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2024-10-04 Paul Eggert <egg...@cs.ucla.edu> + timegm: ignore incoming tm_isdst + Problem reported by Florian Weimer via a proposed glibc patch in: + https://sourceware.org/pipermail/libc-alpha/2024-October/160310.html + * lib/mktime.c (__mktime_internal): Ignore any tm_isdst request + if the timezone never observes DST, as is the case for timegm. + * m4/mktime.m4 (gl_PREREQ_MKTIME): Define new C macro __daylight + if needed. + timegm: desync from glibc for now * config/srclist.txt: Omit time/timegm.c and time/mktime-internal.h for now, until we can sync glibc from Gnulib. diff --git a/lib/mktime.c b/lib/mktime.c index 561c948713..67bfcb956f 100644 --- a/lib/mktime.c +++ b/lib/mktime.c @@ -339,7 +339,9 @@ __mktime_internal (struct tm *tp, bool local, mktime_offset_t *offset) int mday = tp->tm_mday; int mon = tp->tm_mon; int year_requested = tp->tm_year; - int isdst = tp->tm_isdst; + + /* If the timezone never observes DST, ignore any tm_isdst request. */ + int isdst = local && __daylight ? tp->tm_isdst : 0; /* 1 if the previous probe was DST. */ int dst2 = 0; diff --git a/m4/mktime.m4 b/m4/mktime.m4 index 85c52454aa..14ced571e0 100644 --- a/m4/mktime.m4 +++ b/m4/mktime.m4 @@ -1,5 +1,5 @@ # mktime.m4 -# serial 39 +# serial 40 dnl Copyright (C) 2002-2003, 2005-2007, 2009-2024 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -315,4 +315,22 @@ AC_DEFUN([gl_FUNC_MKTIME_INTERNAL], [ ]) # Prerequisites of lib/mktime.c. -AC_DEFUN([gl_PREREQ_MKTIME], [:]) +AC_DEFUN([gl_PREREQ_MKTIME], [ + AC_CACHE_CHECK([spelling of daylight variable], + [gl_cv_var___daylight], + [for gl_cv_var___daylight in __daylight daylight _daylight 0; do + test $gl_cv_var___daylight = 0 && break + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#include <time.h> + ]], + [[return $gl_cv_var___daylight;]]) + ], + [break]) + done]) + AS_CASE([$gl_cv_var___daylight], + [__daylight], [], + [AC_DEFINE_UNQUOTED([__daylight], [$gl_cv_var___daylight], + [Define to an expression equivalent to <time.h> daylight + if <time.h> __daylight does not already do that.])]) +]) -- 2.43.0