summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2010-07-04 07:00:17 -0400
committerJunio C Hamano <gitster@pobox.com>2010-07-05 11:57:07 -0700
commit9ba0f0334dd505f78e0374bbe857c5e202f5a778 (patch)
tree3cc507dba882fd65ce121e7838b699441ecf9050
parentad9d8e8f0f13e054ee30fcdcdb51973ddcfadb37 (diff)
downloadgit-9ba0f0334dd505f78e0374bbe857c5e202f5a778.tar.gz
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>
-rw-r--r--date.c2
-rwxr-xr-xt/t0006-date.sh1
2 files changed, 2 insertions, 1 deletions
diff --git a/date.c b/date.c
index 68cdcaa3f6..3c981f7eb5 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 3ea4f9eff9..b2df4fe102 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