tar: handle 256-base encoding in mtime
authorDenys Vlasenko <vda.linux@googlemail.com>
Wed, 8 Jul 2009 16:58:09 +0000 (18:58 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 8 Jul 2009 16:58:09 +0000 (18:58 +0200)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
archival/libunarchive/get_header_tar.c

index 16e2de440df2028efdacb23c9df54aca6fa595e0..71e08bf7d9fd482eb6f736e4330bbfc2789e82e1 100644 (file)
@@ -301,9 +301,13 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle)
        file_header->uname = tar.uname[0] ? xstrndup(tar.uname, sizeof(tar.uname)) : NULL;
        file_header->gname = tar.gname[0] ? xstrndup(tar.gname, sizeof(tar.gname)) : NULL;
 #endif
-       file_header->mtime = GET_OCTAL(tar.mtime);
-       /* Size field: handle GNU tar's "base256 encoding" */
-       file_header->size = (*tar.size & 0xc0) == 0x80 /* positive base256? */
+       /* mtime: rudimentally handle GNU tar's "base256 encoding"
+        * People report tarballs with NEGATIVE unix times encoded that way */
+       file_header->mtime = (tar.mtime[0] & 0x80) /* base256? */
+                       ? 0 /* bogus */
+                       : GET_OCTAL(tar.mtime);
+       /* size: handle GNU tar's "base256 encoding" */
+       file_header->size = (tar.size[0] & 0xc0) == 0x80 /* positive base256? */
                        ? getBase256_len12(tar.size)
                        : GET_OCTAL(tar.size);
        file_header->gid = GET_OCTAL(tar.gid);