Re: [PATCH 4/5] log: handle integer overflow in timestamps
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Feb 24, 2014, 19:50 UTC
- Message-ID
- <xmqqsir88f4n.fsf@gitster.dls.corp.google.com>
- In-Reply-To
- <20140224074637.GD9969@sigill.intra.peff.net>
Jeff King <peff@peff.net> writes:
Show 13 quoted lines
> If an ident line has a ridiculous date value like (2^64)+1, > we currently just pass ULONG_MAX along to the date code, > which can produce nonsensical dates. > > On systems with a signed long time_t (e.g., 64-bit glibc > systems), this actually doesn't end up too bad. The > ULONG_MAX is converted to -1, we apply the timezone field to > that, and the result ends up somewhere between Dec 31, 1969 > and Jan 1, 1970. > ... > We also recognize overflow in the timezone field, which > could produce nonsensical results. In this case we show the > parsed date, but in UTC.
Both are good measures to fallback to sanity, but why is that if/else? In other words...
Show 8 quoted lines
> + if (date_overflows(date))
> + date = 0;
> + else {
> + if (ident->tz_begin && ident->tz_end)
> + tz = strtol(ident->tz_begin, NULL, 10);
> + if (tz == LONG_MAX || tz == LONG_MIN)
> + tz = 0;
> + }... don't we want to fix an input having a bogus timestamp and also a bogus tz recorded in it?
Show 28 quoted lines
> return show_date(date, tz, mode); > } > > diff --git a/t/t4212-log-corrupt.sh b/t/t4212-log-corrupt.sh > index 83de981..ba25a2e 100755 > --- a/t/t4212-log-corrupt.sh > +++ b/t/t4212-log-corrupt.sh > @@ -65,4 +65,20 @@ test_expect_success 'unparsable dates produce sentinel value (%ad)' ' > test_cmp expect actual > ' > > +# date is 2^64 + 1 > +test_expect_success 'date parser recognizes integer overflow' ' > + commit=$(munge_author_date HEAD 18446744073709551617) && > + echo "Thu Jan 1 00:00:00 1970 +0000" >expect && > + git log -1 --format=%ad $commit >actual && > + test_cmp expect actual > +' > + > +# date is 2^64 - 2 > +test_expect_success 'date parser recognizes time_t overflow' ' > + commit=$(munge_author_date HEAD 18446744073709551614) && > + echo "Thu Jan 1 00:00:00 1970 +0000" >expect && > + git log -1 --format=%ad $commit >actual && > + test_cmp expect actual > +' > + > test_done