summaryrefslogtreecommitdiff
path: root/tests/tar_gnu.c
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2019-07-24 13:36:50 +0200
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2019-07-24 18:10:34 +0200
commit4fdfd1f62a9d50298b0bb71e8bea04174af4a3ab (patch)
treed511b488ce77ef2b0b84b26ead69a1d01375491c /tests/tar_gnu.c
parent30fbd496a1793b4374873144432f9b7a996a689d (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.c13
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);