summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: ad9d8e8)
raw | patch | inline | side by side (parent: ad9d8e8)
author | Jeff King <peff@peff.net> | |
Sun, 4 Jul 2010 11:00:17 +0000 (07:00 -0400) | ||
committer | Junio C Hamano <gitster@pobox.com> | |
Mon, 5 Jul 2010 18:57:07 +0000 (11:57 -0700) |
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>
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>
date.c | patch | blob | history | |
t/t0006-date.sh | patch | blob | history |
index 68cdcaa3f6268855539fcae02c8e87b965204b4d..3c981f7eb5ebaed1ba621f3d4cd960f14145b97a 100644 (file)
--- a/date.c
+++ b/date.c
/* 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 3ea4f9eff923c963aeb9635be6d77dce99f3bf4a..b2df4fe102454daa62c5c8247128d7f22f7e6ea9 100755 (executable)
--- a/t/t0006-date.sh
+++ b/t/t0006-date.sh
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