mailing list of musl libc
 help / color / mirror / code / Atom feed
From: Thorsten Glaser <tg@mirbsd.de>
To: musl@lists.openwall.com
Subject: Re: [musl] Broken mktime calculations when crossing DST boundary
Date: Tue, 26 Mar 2024 21:59:14 +0000 (UTC)	[thread overview]
Message-ID: <Pine.BSM.4.64L.2403262146330.7824@herc.mirbsd.org> (raw)
In-Reply-To: <i7ujVlxhoLctiIws_tA9D37HKfDtrdqtYmZaI2l7SodVQe3ZQeHphhRDvNUbouXM3_E9KS04yTDPg2gSUFtmojHEBv7NwlHSc_DUm3AmMOc=@pm.me>

Alexander Weps dixit:

>> Not at all, glibc’s mktime just throws the towel with
>> EOVERFLOW saying that the requested time does not exist.
>
>How is this not compliant with POSIX?

POSIX indicates that this is valid only if the date is not
representable in time_t, and it has different handling for
dates that fall into gaps, see the other mails from me, as
well as below.

>This is perfectly valid behavior, that is both expected and can be
>handled in code easily.

No, it’s a bug in glibc.

>I have to ask, but have you actually used mktime from the application end?

Of course.

>I am not sure what you mean by correct. Struct tm is neither correct
>nor incorrect. It can be in three states:
>1) Set by user.
>2) Normalized by mktime.
>3) Not fully normalized by mktime.

Huh? No.

>If I get -1, I know the struct tm does not represent valid time_t and I
>handle it and move on.

Define “move on”. With POSIX’ mktime interface, if you get -1 and
EOVERFLOW, then moving further into the same direction will never
give you not -1 again, because -1 is what you get when your tm_year
was too far out of the representation (e.g. 2039 on a system with
a 32-bit time_t).

EOVERFLOW means that the time cannot be represented in time_t, not
that the time cannot be represented in struct tm. And for these
gaps, the time_t values are consecutive (1325239199/1325239200).

>This is perfect example (TZ=Pacific/Apia):
>
>before: 2011-12-31 00:00:00 +14 0
>after1: 2011-12-31 00:00:00 +14 1325239200
>after1: 2011-12-30 00:00:00 +14 -1

No, this cannot give -1 per POSIX.

>Musl instead of giving sane results starts running in the circle at some point:
>after2: 2011-12-29 00:00:00 -10 1325152800
>after3: 2011-12-29 00:00:00 -10 1325152800

That’s because it does this correctly.

>Doesn't work, this will not give the same time next day, this fails on
>STD/DST changes.
>
>Because same time next day is not always 86400 apart.

I know. But the basic assumption that there even is such a
thing as “same time next day” made by you is invalid. POSIX
listed several examples (29ᵗʰ February next year as well as
gaps in timezone offsets).

One thing you can do is to add 86400, localtime(), then check
that at least tm_mday, tm_hour and tm_min (Issue 8d4, line
48052) are what you expect, and handle cases where they aren’t
manually. But having added 86400, you have two starting points
from which to manually approach this (the original value and
the newer value). (Perhaps a location could even skip more than
24 hours in a discontinuity.)

bye,
//mirabilos
-- 
  “Having a smoking section in a restaurant is like having
          a peeing section in a swimming pool.”
						-- Edward Burr

  reply	other threads:[~2024-03-26 22:06 UTC|newest]

Thread overview: 76+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-24 13:36 Alexander Weps
2024-03-24 16:59 ` Alexander Weps
2024-03-24 17:04 ` Rich Felker
2024-03-24 17:12   ` Alexander Weps
2024-03-24 18:00     ` Alexander Weps
2024-03-24 18:02     ` Rich Felker
2024-03-24 18:16       ` Alexander Weps
2024-03-24 18:24         ` Rich Felker
2024-03-24 18:36           ` Alexander Weps
2024-03-24 19:01             ` Joakim Sindholt
2024-03-24 19:05               ` Alexander Weps
2024-03-24 19:06             ` Alexander Weps
2024-03-24 19:13               ` Alexander Weps
2024-03-24 19:13               ` Alexander Weps
2024-03-24 19:22             ` Rich Felker
2024-03-24 19:57               ` Alexander Weps
2024-03-24 20:22                 ` Rich Felker
2024-03-24 20:50                   ` Alexander Weps
2024-03-24 21:43                     ` Alexander Weps
2024-03-24 23:51                 ` Thorsten Glaser
2024-03-25  0:36                   ` Alexander Weps
2024-03-25 11:52                     ` Alexander Weps
2024-03-25 12:21                       ` Rich Felker
2024-03-25 12:55                         ` Alexander Weps
2024-03-25 13:08                           ` Rich Felker
2024-03-25 13:13                             ` Alexander Weps
2024-03-25 13:13                           ` Rich Felker
2024-03-25 13:24                             ` Alexander Weps
2024-03-25 13:42                               ` Rich Felker
2024-03-25 13:48                                 ` Alexander Weps
2024-03-25 13:50                                   ` Alexander Weps
2024-03-25 18:02                                 ` Rich Felker
2024-03-25 18:28                                   ` Alexander Weps
2024-03-25 18:53                                     ` Rich Felker
2024-03-25 18:57                                       ` Alexander Weps
2024-03-25 19:38                                         ` Rich Felker
2024-03-25 19:47                                           ` Rich Felker
2024-03-25 20:05                                             ` Alexander Weps
2024-03-25 20:12                                               ` Alexander Weps
2024-03-25 20:00                                           ` Alexander Weps
2024-03-25 20:23                                             ` Rich Felker
2024-03-25 20:31                                               ` Rich Felker
2024-03-25 23:19                                     ` Thorsten Glaser
2024-03-25 23:16                                 ` Thorsten Glaser
2024-03-25 13:44                               ` Alexander Weps
2024-03-25 22:40                           ` Thorsten Glaser
2024-03-25 22:59                             ` Alexander Weps
2024-03-25 23:34                               ` Thorsten Glaser
2024-03-26 12:45                                 ` Alexander Weps
2024-03-26 21:59                                   ` Thorsten Glaser [this message]
2024-03-27  0:14                                     ` Alexander Weps
2024-03-27  0:38                                       ` Alexander Weps
2024-03-27  1:35                                       ` Thorsten Glaser
2024-03-27  2:45                                         ` Alexander Weps
2024-03-27  4:42                                           ` Thorsten Glaser
2024-03-26 18:56                                 ` Alexander Weps
2024-03-25 23:13                             ` Rich Felker
  -- strict thread matches above, loose matches on Subject: below --
2024-03-22 19:56 Alexander Weps
2024-03-23  6:41 ` Markus Wichmann
     [not found]   ` <528SeRFaPfDw7fA4kqKDlio1U4RB_t9nmUemPcWw9_t1e2hBDpXYFmOqxAC37szgYvAVtmTuXWsmT64SSN3cSQFVdrQqXUAgkdTMPZQ0bg0=@pm.me>
2024-03-23 10:38     ` Markus Wichmann
2024-03-23 11:59       ` Alexander Weps
2024-03-23 12:00         ` Alexander Weps
2024-03-23 12:31           ` Rich Felker
2024-03-23 13:49             ` Alexander Weps
2024-03-23 15:31               ` Rich Felker
2024-03-23 16:54                 ` Alexander Weps
2024-03-23 18:57                   ` Alexander Weps
2024-03-23 19:33                     ` Alexander Weps
2024-03-23 20:18                     ` Rich Felker
2024-03-23 20:40                       ` Alexander Weps
2024-03-24  0:36                         ` Eric Pruitt
2024-03-24  2:04                         ` Rich Felker
2024-03-24  3:32                           ` Daniel Gutson
2024-03-24 11:05                             ` Alexander Weps
2024-03-24 13:24                               ` Alexander Weps
2024-03-23 12:01         ` Alexander Weps

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Pine.BSM.4.64L.2403262146330.7824@herc.mirbsd.org \
    --to=tg@mirbsd.de \
    --cc=musl@lists.openwall.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).