Skip to content

Commit

Permalink
log: do not segfault on gmtime errors
Browse files Browse the repository at this point in the history
Many code paths assume that show_date and show_ident_date
cannot return NULL. For the most part, we handle missing or
corrupt timestamps by showing the epoch time t=0.

However, we might still return NULL if gmtime rejects the
time_t we feed it, resulting in a segfault. Let's catch this
case and just format t=0.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Feb 24, 2014
1 parent 1dca155 commit 2b15846
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 2 deletions.
6 changes: 4 additions & 2 deletions date.c
Original file line number Diff line number Diff line change
Expand Up @@ -184,8 +184,10 @@ const char *show_date(unsigned long time, int tz, enum date_mode mode)
tz = local_tzoffset(time);

tm = time_to_tm(time, tz);
if (!tm)
return NULL;
if (!tm) {
tm = time_to_tm(0, 0);
tz = 0;
}

strbuf_reset(&timebuf);
if (mode == DATE_SHORT)
Expand Down
8 changes: 8 additions & 0 deletions t/t4212-log-corrupt.sh
Original file line number Diff line number Diff line change
Expand Up @@ -76,4 +76,12 @@ test_expect_success 'date parser recognizes time_t overflow' '
test_cmp expect actual
'

# date is within 2^63-1, but enough to choke glibc's gmtime
test_expect_success 'absurdly far-in-future dates produce sentinel' '
commit=$(munge_author_date HEAD 999999999999999999) &&
echo "Thu Jan 1 00:00:00 1970 +0000" >expect &&
git log -1 --format=%ad $commit >actual &&
test_cmp expect actual
'

test_done

0 comments on commit 2b15846

Please sign in to comment.