diff options
author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-07-24 13:36:50 +0200 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-07-24 18:10:34 +0200 |
commit | 4fdfd1f62a9d50298b0bb71e8bea04174af4a3ab (patch) | |
tree | d511b488ce77ef2b0b84b26ead69a1d01375491c /tests/tar_gnu.c | |
parent | 30fbd496a1793b4374873144432f9b7a996a689d (diff) |
Fix processing of tar mtime on 32 bit systems
struct stat uses time_t to store time values. On some 32 bit systems,
this may be a 32 bit integer.
This patch adds a broken-out 64 bit time value to tar_header_decoded_t
and makes sure to clamp the value to +/- (2^32 - 1) if required when
writing it back to a struct stat.
Reported-by: Matt Turner <mattst88@gmail.com>
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'tests/tar_gnu.c')
-rw-r--r-- | tests/tar_gnu.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/tests/tar_gnu.c b/tests/tar_gnu.c index c5f8ddb..4f78da7 100644 --- a/tests/tar_gnu.c +++ b/tests/tar_gnu.c @@ -48,6 +48,7 @@ int main(void) assert(hdr.sb.st_gid == 01750); assert(hdr.sb.st_size == 5); assert(hdr.sb.st_mtime == 1542905892); + assert(hdr.mtime == 1542905892); assert(strcmp(hdr.name, "input.txt") == 0); assert(!hdr.unknown_record); assert(read_data("data0", fd, buffer, 5) == 0); @@ -63,6 +64,7 @@ int main(void) assert(hdr.sb.st_gid == 01750); assert(hdr.sb.st_size == 5); assert(hdr.sb.st_mtime == 013375560044); + assert(hdr.mtime == 013375560044); assert(strcmp(hdr.name, "input.txt") == 0); assert(!hdr.unknown_record); assert(read_data("data1", fd, buffer, 5) == 0); @@ -78,6 +80,7 @@ int main(void) assert(hdr.sb.st_gid == 01750); assert(hdr.sb.st_size == 8589934592); assert(hdr.sb.st_mtime == 013375730126); + assert(hdr.mtime == 013375730126); assert(strcmp(hdr.name, "big-file.bin") == 0); assert(!hdr.unknown_record); clear_header(&hdr); @@ -90,6 +93,7 @@ int main(void) assert(hdr.sb.st_gid == 0x80000000); assert(hdr.sb.st_size == 5); assert(hdr.sb.st_mtime == 013376036700); + assert(hdr.mtime == 013376036700); assert(strcmp(hdr.name, "input.txt") == 0); assert(!hdr.unknown_record); assert(read_data("data2", fd, buffer, 5) == 0); @@ -104,7 +108,12 @@ int main(void) assert(hdr.sb.st_uid == 01750); assert(hdr.sb.st_gid == 01750); assert(hdr.sb.st_size == 5); - assert(hdr.sb.st_mtime == 8589934592); +#if SIZEOF_TIME_T < 8 + assert(hdr.sb.st_mtime == INT32_MAX); +#else + assert(hdr.sb.st_mtime == 8589934592L); +#endif + assert(hdr.mtime == 8589934592L); assert(strcmp(hdr.name, "input.txt") == 0); assert(!hdr.unknown_record); assert(read_data("data3", fd, buffer, 5) == 0); @@ -120,6 +129,7 @@ int main(void) assert(hdr.sb.st_gid == 01750); assert(hdr.sb.st_size == 5); assert(hdr.sb.st_mtime == -315622800); + assert(hdr.mtime == -315622800); assert(strcmp(hdr.name, "input.txt") == 0); assert(!hdr.unknown_record); assert(read_data("data4", fd, buffer, 5) == 0); @@ -135,6 +145,7 @@ int main(void) assert(hdr.sb.st_gid == 01750); assert(hdr.sb.st_size == 5); assert(hdr.sb.st_mtime == 1542909670); + assert(hdr.mtime == 1542909670); assert(strcmp(hdr.name, filename) == 0); assert(!hdr.unknown_record); assert(read_data("data5", fd, buffer, 5) == 0); |