bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 2/2] timegm: ignore incoming tm_isdst


From: Paul Eggert
Subject: [PATCH 2/2] timegm: ignore incoming tm_isdst
Date: Fri, 4 Oct 2024 09:16:38 -0700

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  <eggert@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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]