diff options
author | Junio C Hamano <gitster@pobox.com> | 2017-05-16 11:51:59 +0900 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2017-05-16 11:51:59 +0900 |
commit | b15667bbdc5ab7732caac977068f5d1cf083115e (patch) | |
tree | ad171d36adab7298daa32172dd81906899a38660 /archive-zip.c | |
parent | afc5f2ce63be2a51b1f87467065e47c398468c9e (diff) | |
parent | 3f789719a65bfa6c302e8f794847a3eb69b6881b (diff) | |
download | git-b15667bbdc5ab7732caac977068f5d1cf083115e.tar.gz |
Merge branch 'js/larger-timestamps'
Some platforms have ulong that is smaller than time_t, and our
historical use of ulong for timestamp would mean they cannot
represent some timestamp that the platform allows. Invent a
separate and dedicated timestamp_t (so that we can distingiuish
timestamps and a vanilla ulongs, which along is already a good
move), and then declare uintmax_t is the type to be used as the
timestamp_t.
* js/larger-timestamps:
archive-tar: fix a sparse 'constant too large' warning
use uintmax_t for timestamps
date.c: abort if the system time cannot handle one of our timestamps
timestamp_t: a new data type for timestamps
PRItime: introduce a new "printf format" for timestamps
parse_timestamp(): specify explicitly where we parse timestamps
t0006 & t5000: skip "far in the future" test when time_t is too limited
t0006 & t5000: prepare for 64-bit timestamps
ref-filter: avoid using `unsigned long` for catch-all data type
Diffstat (limited to 'archive-zip.c')
-rw-r--r-- | archive-zip.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/archive-zip.c b/archive-zip.c index e81c5ac15a..27563e9e26 100644 --- a/archive-zip.c +++ b/archive-zip.c @@ -593,9 +593,17 @@ static void write_zip_trailer(const unsigned char *sha1) write_or_die(1, sha1_to_hex(sha1), GIT_SHA1_HEXSZ); } -static void dos_time(time_t *time, int *dos_date, int *dos_time) +static void dos_time(timestamp_t *timestamp, int *dos_date, int *dos_time) { - struct tm *t = localtime(time); + time_t time; + struct tm *t; + + if (date_overflows(*timestamp)) + die("timestamp too large for this system: %"PRItime, + *timestamp); + time = (time_t)*timestamp; + t = localtime(&time); + *timestamp = time; *dos_date = t->tm_mday + (t->tm_mon + 1) * 32 + (t->tm_year + 1900 - 1980) * 512; |