Ok, so mktime is forced to return in time UTC time scale earlier in the
code:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main()
{
    struct tm t;
    time_t now = time((void*)0);
    localtime_r(&now, &t);
    setenv("TZ", "UTC", 1);
    t.tm_isdst = 4000000001;
    printf("%ld\n", mktime(&t));
    t.tm_isdst = 0;
    printf("%ld\n", mktime(&t));
    t.tm_isdst = -1;
    printf("%ld\n", mktime(&t));
}

1618941220
1618941220
1618941220

So my problem might come from the fact that I do not have any timezone
database on my system.




On Tue, Apr 20, 2021 at 5:30 PM Lars Munch <l...@segv.dk> wrote:

> Indeed, any positive random number in tm.tm_isdst will set DST in effect
> it seems.
>
> On my stripped down ARM system with no timezone information, it will
> simply return -1.
>
> On Tue, Apr 20, 2021 at 4:26 PM Michael Galassi <mich...@galassi.us>
> wrote:
>
>> Somewhere lies a bug.  The following code snippet:
>> #include <stdio.h>
>> #include <time.h>
>> int main()
>> {
>>     struct tm t;
>>     time_t now = time((void*)0);
>>     localtime_r(&now, &t);
>>     t.tm_isdst = 1;
>>     printf("%ld\n", mktime(&t));
>>     t.tm_isdst = 0;
>>     printf("%ld\n", mktime(&t));
>>     t.tm_isdst = -1;
>>     printf("%ld\n", mktime(&t));
>> }
>> Yields:
>> 1618928503
>> 1618932103
>> 1618932103
>> This is true on FreeBSD 13 and Ubuntu 18.04, both fully patched.
>>
>> -michael
>>
>> On Tue, Apr 20, 2021 at 7:04 AM Richard Cochran <richardcoch...@gmail.com>
>> wrote:
>>
>>> On Tue, Apr 20, 2021 at 11:44:06AM +0200, Lars Munch wrote:
>>> > tm_isdst needs to be initialized to make sure mktime does not fail
>>> > or calculates the wrong time.
>>>
>>> No, take a look at the mktime(3) man page.  There you will read the
>>> following.
>>>
>>>        The  mktime() function modifies the fields of the tm structure as
>>> fol‐
>>>        lows: tm_wday and tm_yday are set to values determined from  the
>>> con‐
>>>        tents  of  the  other  fields;  if structure members are outside
>>> their
>>>        valid interval, they will be normalized (so that, for example,
>>> 40  Oc‐
>>>        tober  is changed into 9 November); tm_isdst is set (regardless
>>> of its
>>>        initial value) to a positive value or to 0, respectively, to
>>> indicate
>>>        whether DST is or is not in effect at the specified time.
>>>
>>> Thanks,
>>> Richard
>>>
>>>
>>> _______________________________________________
>>> Linuxptp-devel mailing list
>>> Linuxptp-devel@lists.sourceforge.net
>>> https://lists.sourceforge.net/lists/listinfo/linuxptp-devel
>>>
>>
_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to