git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 2/2] parse_date: fix signedness in timezone calculation

From
Jeff King <peff@peff.net>
Date
Jul 4, 2010, 11:00 UTC
Message-ID
<20100704110017.GA23121@sigill.intra.peff.net>
In-Reply-To
<20100704104834.GA23070@sigill.intra.peff.net>

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>
---
Are there any platforms with an unsigned time_t? In that case, we would
need to use a regular "long" to get signedness. Presumably on such
platforms "long" will grow with time_t to 64-bits so we don't create a
Y2038 problem (though most of the rest of the code uses "unsigned long"
interchangeably with time_t, so we have a Y2106 problem in that case
anyway).
 date.c          |    2 +-
 t/t0006-date.sh |    1 +
 2 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/date.c b/date.c
index 68cdcaa..3c981f7 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 3ea4f9e..b2df4fe 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
-- 
1.7.2.rc1.209.g2a36c
Previous: Jeff KingNext: Junio C Hamano
Message 2 of 11 in “t0006: test timezone parsing”
  1. 1/2 t0006: test timezone parsingJeff King, Jul 4, 2010
  2. 2/2 parse_date: fix signedness in timezone calculationJeff King, Jul 4, 2010
  3. Junio C HamanoJul 6, 2010
  4. t/t0006: specify timezone as EST5 not EST to comply with POSIXBrandon Casey, Jul 6, 2010
  5. Alex RiesenJul 7, 2010
  6. Jeff KingJul 7, 2010
  7. Andreas SchwabJul 7, 2010
  8. Junio C HamanoJul 6, 2010
  9. Jeff KingJul 6, 2010
  10. Jeff KingJul 6, 2010
  11. Junio C HamanoJul 7, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.