Re: [PATCH 4/5] log: handle integer overflow in timestamps
- From
Jeff King <peff@peff.net>
- Date
- Feb 24, 2014, 20:37 UTC
- Message-ID
- <20140224203709.GA25506@sigill.intra.peff.net>
- In-Reply-To
- <xmqqeh2s8do2.fsf@gitster.dls.corp.google.com>
On Mon, Feb 24, 2014 at 12:21:33PM -0800, Junio C Hamano wrote:
Show 20 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?
> >
> > If there is a bogus timestamp, then we do not want to look at tz at all.
> > We leave it at "0", so that we get a true sentinel:
>
> Ah, OK, I missed the initialization to 0 at the beginning.
>
> It might have been more clear if "int tz" declaration were left
> uninitialized, and the variable were explicitly cleared to 0 in the
> "date-overflows" error codepath, but it is not a big deal.It might be, but I think it would end up cumbersome. The initialization was already there from the previous version, which was hitting the else for "ident->tz_begin". Without fallback initializations, you end up with:
if (ident->date_begin && ident->date_end) {
date = strtoul(ident->date_begin, NULL, 10);
if (date_overflows(date)) {
date = 0;
tz = 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;
} else
tz = 0;
}
} else {
date = 0;
tz = 0;
}which I think is much more confusing (and hard to verify that the variables are always set). Checking !date as an error condition would make it a little more readable:
if (ident->date_begin && ident->date_end) {
date = strtoul(ident->date_begin, NULL, 10);
if (date_overflows(date))
date = 0;
} else
date = 0; if (date) {
if (ident->tz_begin && ident->tz_end) {
tz = strtol(ident->tz_begin, NULL, 10);
if (tz == LONG_MAX || tz == LONG_MIN)
tz = 0;
} else
tz = 0;
} else
tz = 0;but then we treat date==0 as a sentinel, and can never correctly parse dates on Jan 1, 1970.
So I'd be in favor of keeping it as-is, but feel free to mark it up if you feel strongly.
-Peff