Re: gmtime_r bug in High Sierra?
Re: gmtime_r bug in High Sierra?
- Subject: Re: gmtime_r bug in High Sierra?
- From: "Stephen J. Butler" <email@hidden>
- Date: Sun, 10 Sep 2017 01:26:23 -0500
APFS has nanosecond based timestamps, and HFS+ only has second based
timestamps. You'll need to scale accordingly.
On Sun, Sep 10, 2017 at 1:13 AM, Stephane Sudre <email@hidden>
wrote:
> 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:
> >>
> email@hidden
> >>
> >> 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