Re: gmtime_r bug in High Sierra?
Re: gmtime_r bug in High Sierra?
- Subject: Re: gmtime_r bug in High Sierra?
- From: Stephane Sudre <email@hidden>
- Date: Sun, 10 Sep 2017 08:13:51 +0200
Very interesting. Thanks.
As a matter of fact, the code (and the value sent to gmtime_r) are
extracted from the xar Apple source code (and when it's run on High
Sierra):
https://opensource.apple.com/source/xar/xar-357/xar/lib/darwinattr.c.auto.html
stragglers_archive
So now, it looks like the problem is earlier in the code and it comes
from the value returned by getattrlist(2).
If I run the code (*) for a file on a HFS+ volume, the value looks correct.
If I run the code for a file on a APFS volume, the value looks incorrect.
* In conditions specific to the code using the xar code, which is a
launchd daemon and playing with a file that was very recently created.
On Sun, Sep 10, 2017 at 3:23 AM, Stephen J. Butler
<email@hidden> wrote:
> It's not a bug IMHO. The problem is that you don't check the return value of
> gmtime_r(). If you did, you'd see that the result is NULL (which means the
> function failed) and so you shouldn't use any of the results (they're
> undefined).
>
> #include <unistd.h>
> #include <time.h>
> #include <string.h>
> #include <stdio.h>
>
> int main(int argc, const char * argv[]) {
>
> char tmpc[128];
> struct tm tm;
>
> memset(tmpc, 0, sizeof(tmpc));
>
> __darwin_time_t tValue=2914986787602432000;
>
> if (gmtime_r(&tValue, &tm)) {
> strftime(tmpc, sizeof(tmpc), "%FT%T", &tm);
>
> printf("time: %s\n",tmpc);
>
> printf("-----------------\n");
> }
>
> struct tm tm2;
> tm2.tm_mon=10240;
>
> memset(tmpc, 0, sizeof(tmpc));
>
> tValue=2914986787602432000;
>
> if (gmtime_r(&tValue, &tm2)) {
> strftime(tmpc, sizeof(tmpc), "%FT%T", &tm2);
>
> printf("time: %s\n",tmpc);
> }
>
> return 0;
> }
>
>
> But also here, the number you're providing to tValue looks a lot like
> nanosecond time stamp, and gmtime_r() expects seconds. If you correct that,
> then you get:
>
> time: 2062-05-16T06:33:07
> -----------------
> time: 2062-05-16T06:33:07
>
>
> On Sat, Sep 9, 2017 at 5:51 PM, Stephane Sudre <email@hidden>
> wrote:
>>
>> Maybe I'm missing something (regarding the tm var) but shouldn't all
>> the struct tm fields be correctly set by gmtime_r?
>>
>> #include <unistd.h>
>> #include <time.h>
>> #include <string.h>
>> #include <stdio.h>
>>
>> int main(int argc, const char * argv[]) {
>>
>> char tmpc[128];
>> struct tm tm;
>>
>> memset(tmpc, 0, sizeof(tmpc));
>>
>> __darwin_time_t tValue=2914986787602432000;
>>
>> gmtime_r(&tValue, &tm);
>> strftime(tmpc, sizeof(tmpc), "%FT%T", &tm);
>>
>> printf("time: %s\n",tmpc);
>>
>> printf("-----------------\n");
>>
>> struct tm tm2;
>> tm2.tm_mon=10240;
>>
>> memset(tmpc, 0, sizeof(tmpc));
>>
>> tValue=2914986787602432000;
>>
>> gmtime_r(&tValue, &tm2);
>> strftime(tmpc, sizeof(tmpc), "%FT%T", &tm2);
>>
>> printf("time: %s\n",tmpc);
>>
>> return 0;
>> }
>>
>> =>
>>
>> time: 1900-01-00T18:40:00
>> -----------------
>> time: 1900-10241-00T18:40:00
>> _______________________________________________
>> Do not post admin requests to the list. They will be ignored.
>> Darwin-dev mailing list (email@hidden)
>> Help/Unsubscribe/Update your Subscription:
>>
>>
>> This email sent to email@hidden
>
>
--
Packaging Resources - http://s.sudre.free.fr/Packaging.html
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Darwin-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden