From: Jeff King Date: Sun, 4 Jul 2010 11:00:17 +0000 (-0400) Subject: parse_date: fix signedness in timezone calculation X-Git-Tag: v1.7.2-rc2~7 X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=9ba0f0334dd505f78e0374bbe857c5e202f5a778;p=git.git 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 1275404416 +119304128 Instead, we should perform this subtraction as a time_t, the same type that mktime returns. Signed-off-by: Jeff King Signed-off-by: Junio C Hamano --- diff --git a/date.c b/date.c index 68cdcaa3f..3c981f7eb 100644 --- a/date.c +++ b/date.c @@ -635,7 +635,7 @@ int parse_date_toffset(const char *date, unsigned long *timestamp, int *offset) /* mktime uses local timezone */ *timestamp = tm_to_time_t(&tm); if (*offset == -1) - *offset = (*timestamp - mktime(&tm)) / 60; + *offset = ((time_t)*timestamp - mktime(&tm)) / 60; if (*timestamp == -1) return -1; diff --git a/t/t0006-date.sh b/t/t0006-date.sh index 3ea4f9eff..b2df4fe10 100755 --- a/t/t0006-date.sh +++ b/t/t0006-date.sh @@ -39,6 +39,7 @@ check_parse 2008-02 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 -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() { echo "$1 -> $2 +0000" >expect