parse_date: fix signedness in timezone calculation

When no timezone is specified, we deduce the offset by
subtracting the result of mktime from our calculated
timestamp.

However, our timestamp is stored as an unsigned integer,
meaning we perform the subtraction as unsigned. For a
negative offset, this means we wrap to a very high number,
and our numeric timezone is in the millions of hours. You
can see this bug by doing:

   $ TZ=EST \
     GIT_AUTHOR_DATE='2010-06-01 10:00' \
     git commit -a -m foo
   $ git cat-file -p HEAD | grep author
   author Jeff King <peff@peff.net> 1275404416 +119304128

Instead, we should perform this subtraction as a time_t, the
same type that mktime returns.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2010-07-04 07:00:17 -04:00 committed by Junio C Hamano
parent ad9d8e8f0f
commit 9ba0f0334d
2 changed files with 2 additions and 1 deletions

2
date.c
View File

@ -635,7 +635,7 @@ int parse_date_toffset(const char *date, unsigned long *timestamp, int *offset)
/* mktime uses local timezone */ /* mktime uses local timezone */
*timestamp = tm_to_time_t(&tm); *timestamp = tm_to_time_t(&tm);
if (*offset == -1) if (*offset == -1)
*offset = (*timestamp - mktime(&tm)) / 60; *offset = ((time_t)*timestamp - mktime(&tm)) / 60;
if (*timestamp == -1) if (*timestamp == -1)
return -1; return -1;

View File

@ -39,6 +39,7 @@ check_parse 2008-02 bad
check_parse 2008-02-14 bad check_parse 2008-02-14 bad
check_parse '2008-02-14 20:30:45' '2008-02-14 20:30:45 +0000' check_parse '2008-02-14 20:30:45' '2008-02-14 20:30:45 +0000'
check_parse '2008-02-14 20:30:45 -0500' '2008-02-14 20:30:45 -0500' check_parse '2008-02-14 20:30:45 -0500' '2008-02-14 20:30:45 -0500'
check_parse '2008-02-14 20:30:45' '2008-02-14 20:30:45 -0500' EST
check_approxidate() { check_approxidate() {
echo "$1 -> $2 +0000" >expect echo "$1 -> $2 +0000" >expect