X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Flist.c;h=6b69bc6c19ea745fcba2bd6cdc7a3ec0779d4511;hb=7be178a4d4c884e0ddd27ce93e04a00411f4332a;hp=396d83aaf1fcb2f1e3520bbf636aa24886de96d9;hpb=e4e624848b53ac02f1212af2209a63d28e40afec;p=chaz%2Ftar diff --git a/src/list.c b/src/list.c index 396d83a..6b69bc6 100644 --- a/src/list.c +++ b/src/list.c @@ -35,7 +35,6 @@ union block *current_header; /* points to current archive header */ struct stat current_stat; /* stat struct corresponding */ enum archive_format current_format; /* recognized format */ -static char const *tartime PARAMS ((time_t)); static uintmax_t from_header PARAMS ((const char *, size_t, const char *, uintmax_t, uintmax_t)); @@ -160,12 +159,12 @@ read_and (void (*do_something) ()) switch (prev_status) { case HEADER_STILL_UNREAD: - WARN ((0, 0, _("This does not look like a tar archive"))); + ERROR ((0, 0, _("This does not look like a tar archive"))); /* Fall through. */ case HEADER_ZERO_BLOCK: case HEADER_SUCCESS: - WARN ((0, 0, _("Skipping to next header"))); + ERROR ((0, 0, _("Skipping to next header"))); break; case HEADER_END_OF_FILE: @@ -566,16 +565,25 @@ from_header (char const *where0, size_t digs, char const *type, } /* Parse the output of older, unportable tars, which generate - negative values in two's complement octal. */ - if ((overflow || maxval < value) && '4' <= *where1) + negative values in two's complement octal. If the leading + nonzero digit is 1, we can't recover the original value + reliably; so do this only if the digit is 2 or more. This + catches the common case of 32-bit negative time stamps. */ + if ((overflow || maxval < value) && '2' <= *where1) { /* Compute the negative of the input value, assuming two's complement. */ - for (value = 0, where = where1, overflow = 0; ; ) + int digit = (*where1 - '0') | 4; + overflow = 0; + value = 0; + where = where1; + for (;;) { - value += 7 - (*where++ - '0'); + value += 7 - digit; + where++; if (where == lim || ! ISODIGIT (*where)) break; + digit = *where - '0'; overflow |= value ^ (value << LG_8 >> LG_8); value <<= LG_8; } @@ -816,7 +824,7 @@ stringify_uintmax_t_backwards (uintmax_t o, char *buf) /* Return a printable representation of T. The result points to static storage that can be reused in the next call to this function, to ctime, or to asctime. */ -static char const * +char const * tartime (time_t t) { static char buffer[max (UINTMAX_STRSIZE_BOUND + 1,