From: Alexander Weps <exander77@pm.me>
To: musl@lists.openwall.com
Subject: Re: [musl] Broken mktime calculations when crossing DST boundary
Date: Wed, 27 Mar 2024 00:14:23 +0000 [thread overview]
Message-ID: <qlW23onKKWtg0mINpspLbsbYwt54A7u29SMSyOh-l2diDIsv4rowiblg0PUkqGp0d3uSxxN5p2yEukoictQQuhMcMRDn20HBHYiMm9OeO7U=@pm.me> (raw)
In-Reply-To: <Pine.BSM.4.64L.2403262146330.7824@herc.mirbsd.org>
See below.
AW
On Tuesday, March 26th, 2024 at 22:59, Thorsten Glaser <tg@mirbsd.de> wrote:
> 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.
>
I think you confuse two things here:
1. mktime returning -1
2. mktime setting errno to EOVERFLOW
The 2. maybe debatable in obscure circles, but that's entirely unrelated.
But mktime can return -1 if and when it deems that struct tm cannot be represented in epoch seconds.
That is entirely compliant with POSIX and I would need to see some hard evidence for it not being the case.
From Issue 7:
> RETURN VALUE
>
> The mktime() function shall return the specified time since the Epoch encoded as a value of type time_t. If the time since the Epoch cannot be represented, the function shall return the value (time_t)-1 [CX] [Option Start] and set errno to indicate the error. [Option End]
>
> ERRORS
>
> The mktime() function shall fail if:
>
> [EOVERFLOW]
> [CX] [Option Start] The result cannot be represented. [Option End]
First and foremost mktime may fail and when it fails it returns -1.
Issue 6: If the time since the Epoch cannot be represented, the function shall return the value (time_t)-1 and may set errno to indicate the error.
Isuse 7: If the time since the Epoch cannot be represented, the function shall return the value (time_t)-1 and set errno to indicate the error.
Only errno offered is EOVERFLOW.
So I interpret it that since Issue 7, the correct behavior is to set errno to EOVERFLOW.
Also from:
Minutes of the 27th July 2023 Teleconference Austin-1332 Page 1 of 1
Submitted by Andrew Josey, The Open Group. 28th July 2023
> Bug 1614: XSH 3/mktime does not specify EINVAL and should Accepted as Marked
> https://austingroupbugs.net/view.php?id=1614
>
> An interpretation is required.
>
> Interpretation response:
> The standard clearly states that when an unsuccessful call to
> mktime() returns (time_t)-1 it sets errno to [EOVERFLOW], and
> conforming implementations must conform to this.
>
> Rationale:
>
> The RETURN VALUE section on the mktime() page states:
> If the time since the Epoch cannot be represented, the function
> shall return the value (time_t)-1 [CX]and set errno to indicate
> the error[/CX].
>
> This requires that errno is set to indicate "the error", and the
> beginning of the sentence states the nature of the error condition
> to which "the error" refers: the time since the Epoch (i.e. the
> integer value to be returned) cannot be represented. The ERRORS
> section requires that the error number [EOVERFLOW] is used for this
> condition.
>
> Thus the standard requires that errno is set to [EOVERFLOW] when
> an unsuccessful call to mktime() returns (time_t)-1 and an
> implementation that sets it to [EINVAL] does not conform.
>
> The mktime() function does not have any way to indicate to the
> caller that an error other than [EOVERFLOW] occurred.
> > 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.
Then explain what is incorrect struct tm.
>
> > 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).
Not true as shown above.
>
> 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).
No, return value -1 means that the time cannot represented as epoch seconds (for any number of reasons).
Required errno is Issue 7 change that should be used to indicate type of error, but only EOVERFLOW is listed.
>
> > 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.
Not true as shown above.
>
> > 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
next prev parent reply other threads:[~2024-03-27 0:14 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
2024-03-27 0:14 ` Alexander Weps [this message]
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='qlW23onKKWtg0mINpspLbsbYwt54A7u29SMSyOh-l2diDIsv4rowiblg0PUkqGp0d3uSxxN5p2yEukoictQQuhMcMRDn20HBHYiMm9OeO7U=@pm.me' \
--to=exander77@pm.me \
--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).