Re: gmtime_r bug in High Sierra?
Re: gmtime_r bug in High Sierra?
- Subject: Re: gmtime_r bug in High Sierra?
- From: Thomas Tempelmann <email@hidden>
- Date: Sun, 10 Sep 2017 08:27:51 +0200
With this comment, I'll cross-post this to the filesystem-dev list, as this
could be a bug in the APFS code, making this a bit urgent with the imminent
release of 10.13
But it could also be that there's a new(?) flag somewhere that you need to
test in order to tell whether the values are in seconds or microseconds.
Maybe someone on the filesystem list could clarify this?
Thomas
On Sun, Sep 10, 2017 at 8: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:
This email sent to email@hidden