|
Message-ID: <a99XFm_NEHaIt7cSbDuCl0QKklI6qfRAfETlzuLE4Wv8F0mc21ZXJpQXbcE7Ra_s2PNz2by6gXgPF6vMx_6s7vwPvna22u1-QPRi1rzsus0=@pm.me> Date: Sun, 24 Mar 2024 18:00:06 +0000 From: Alexander Weps <exander77@...me> To: musl@...ts.openwall.com Cc: Daniel Gutson <danielgutson@...il.com>, Markus Wichmann <nullplan@....net> Subject: Re: Broken mktime calculations when crossing DST boundary So I started from: 1900-01-01 00:00:00 Adding 59 seconds each cycle (to speed things up). And I already have some cycles in Musl even for Europe/Prague. 1946-12-01 02:59:17 CET 1946-12-01 01:00:16 CET <-- There should be: 1946-12-01 02:00:16 GMT This looks like an issue involving negative DST change. There were 3 STD/DST changes in 1946 in Europe/Prague: 1945-10-01 01:00:00Z +01:00:00 standard CET 1946-05-06 01:00:00Z +02:00:00 daylight CEST 1946-10-06 01:00:00Z +01:00:00 standard CET 1946-12-01 02:00:00Z +00:00:00 daylight GMT 1947-02-23 02:00:00Z +01:00:00 standard CET And it works in glibc. I was able to run it all the way from 1900 to 2200. Glibc correctly went from CET to GMT and then back: 1946-12-01 02:59:57 CET 1946-12-01 02:00:56 GMT ... AW On Sunday, March 24th, 2024 at 18:12, Alexander Weps <exander77@...me> wrote: > Adding seconds cannot make time go backwards. If that is how it was interpreted, than the interpretation is erroneous. > > I think I will do some test. > > If you start with 1900-01-01 00:00:00 and start adding seconds and calling mktime, you should reliable get to 2200-12-31 59:59:59 in all timezones. Same goes for minutes, hours, days, years. > > If that's not the case then the interpretation in musl is wrong. > > This is a basic elementary functionality of mktime. > > There can't be any going back in time a cycles. > > AW > > > > On Sunday, March 24th, 2024 at 18:04, Rich Felker dalias@...c.org wrote: > > > On Sun, Mar 24, 2024 at 01:36:42PM +0000, Alexander Weps wrote: > > > > > Also thanks for the Pacific/Apia example. Not only that it fails for that date: > > > Pattern: * * * * * * > > > Initial: 2011-12-29_23:59:59 > > > Expected: 2011-32-31_00:00:00 > > > Actual: 2011-12-29_00:00:00 > > > My cron tool again going back in time. > > > > > > It fails one other test. > > > > > > I have to run my tests on multiple timezones. > > > > > > And it works in glibc. > > > > > > And that's after I removed tm_isdst and rewrote half the code to accommodate. > > > > > > Can We agree on some simple premise that with no uncertain STD/DST > > > settings (tm_isdst = 0 or tm_isdst = 1), incrementing seconds by 1 > > > and calling mktime should never cause time to go back? > > > > > > Well, behold Pacific/Apia: > > > > > > I set 2011-12-29 23:59:59: > > > > > > tm_sec: 59 > > > tm_min: 59 > > > tm_hour: 23 > > > tm_mday: 29 > > > tm_mon: 11 > > > tm_year: 111 > > > tm_wday: 0 > > > tm_yday: 0 > > > tm_isdst: 1 > > > tm_gmtoff: 0 > > > tm_zone: (null) > > > > > > Calling mktime to see if everything is correct: > > > mktime(&tm); > > > > > > before: 2011-12-29 23:59:59 -10 > > > tm_sec: 59 > > > tm_min: 59 > > > tm_hour: 23 > > > tm_mday: 29 > > > tm_mon: 11 > > > tm_year: 111 > > > tm_wday: 4 > > > tm_yday: 362 > > > tm_isdst: 1 > > > tm_gmtoff: -36000 > > > tm_zone: -10 > > > > > > Incrementing seconds and calling mktime: > > > tm.tm_sec += 1; > > > mktime(&tm); > > > > > > after: 2011-12-29 00:00:00 -10 > > > tm_sec: 0 > > > tm_min: 0 > > > tm_hour: 0 > > > tm_mday: 29 > > > tm_mon: 11 > > > tm_year: 111 > > > tm_wday: 4 > > > tm_yday: 362 > > > tm_isdst: 1 > > > tm_gmtoff: -36000 > > > tm_zone: -10 > > > We went from: > > > 2011-12-29 23:59:59 -10 > > > To: > > > 2011-12-29 00:00:00 -10 > > > > > > By adding 1 second. The tm_isdst was not set to -1. > > > > > > This is totally unreliable. > > > > From what I understand, you've set the input to a time that doesn't > > exist in the local timezone: 2011-12-30 00:00:00. This could be either > > 1 second after 2011-12-29 23:59:59, as you intended, or 1 day before > > 2011-12-31 00:00:00. The latter is how it was interpreted. However, it > > does not seem to have correctly set tm_gmtoff to reflect how it was > > interpreted. We should check this out because that's probably an > > actual bug. > > > > Rich
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.