X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Flist.c;h=884a5d2fac4a0bbef3401e671b39b00ad68a7520;hb=ee734033e8a389737843a7973b2ebf4a447516a1;hp=7a9bd5079b4f0dc5da34fe208e4f7e3034c8f153;hpb=e1ac06bccae865dc1cd7266302961a0ff68716b3;p=chaz%2Ftar diff --git a/src/list.c b/src/list.c index 7a9bd50..884a5d2 100644 --- a/src/list.c +++ b/src/list.c @@ -1,5 +1,5 @@ /* List a tar archive, with support routines for reading a tar archive. - Copyright (C) 1988, 92, 93, 94, 96, 97 Free Software Foundation, Inc. + Copyright 1988,92,93,94,96,97,98,1999 Free Software Foundation, Inc. Written by John Gilmore, on 1985-08-26. This program is free software; you can redistribute it and/or modify it @@ -20,6 +20,7 @@ #undef USE_OLD_CTIME #include "system.h" +#include #include #include @@ -38,6 +39,9 @@ union block *current_header; /* points to current archive header */ struct stat current_stat; /* stat struct corresponding */ enum archive_format current_format; /* recognized format */ +static uintmax_t from_oct PARAMS ((const char *, size_t, const char *, uintmax_t)); + + /*-----------------------------------. | Main loop for reading an archive. | `-----------------------------------*/ @@ -319,6 +323,7 @@ read_header (void) long unsigned_sum; /* the POSIX one :-) */ long signed_sum; /* the Sun one :-( */ long recorded_sum; + uintmax_t parsed_sum; char *p; union block *header; char **longp; @@ -334,8 +339,13 @@ read_header (void) if (!header) return HEADER_END_OF_FILE; - recorded_sum = UINTMAX_FROM_OCT (header->header.chksum); + parsed_sum = from_oct (header->header.chksum, + sizeof header->header.chksum, + (char *) 0, TYPE_MAXIMUM (long)); + if (parsed_sum == (uintmax_t) -1) + return HEADER_FAILURE; + recorded_sum = parsed_sum; unsigned_sum = 0; signed_sum = 0; p = header->buffer; @@ -548,8 +558,9 @@ from_oct (const char *where0, size_t digs0, const char *type, uintmax_t maxval) { if (digs == 0) { - ERROR ((0, 0, _("Blanks in header where octal %s value expected"), - type)); + if (type) + ERROR ((0, 0, _("Blanks in header where octal %s value expected"), + type)); return -1; } if (!ISSPACE (*where)) @@ -571,8 +582,23 @@ from_oct (const char *where0, size_t digs0, const char *type, uintmax_t maxval) if (digs != 0 && *where && !ISSPACE (*where)) { - ERROR ((0, 0, _("Header contains `%.*s' where octal %s value expected"), - (int) digs0, where0, type)); + if (type) + { + char buf[1000]; /* Big enough to represent any header. */ + static struct quoting_options *o; + + if (!o) + { + o = clone_quoting_options ((struct quoting_options *) 0); + set_quoting_style (o, escape_quoting_style); + } + + quotearg_buffer (buf, sizeof buf, where0, digs0, o); + ERROR ((0, 0, + _("Header contains \"%.*s\" where octal %s value expected"), + (int) sizeof buf, buf, type)); + } + return -1; } @@ -580,54 +606,55 @@ from_oct (const char *where0, size_t digs0, const char *type, uintmax_t maxval) return value; out_of_range: - ERROR ((0, 0, _("Octal value `%.*s' is out of range for %s"), - (int) digs0, where0, type)); + if (type) + ERROR ((0, 0, _("Octal value `%.*s' is out of range for %s"), + (int) digs0, where0, type)); return -1; } gid_t gid_from_oct (const char *p, size_t s) { - return from_oct (p, s, "gid_t", GID_MAX); + return from_oct (p, s, "gid_t", (uintmax_t) TYPE_MAXIMUM (gid_t)); } major_t major_from_oct (const char *p, size_t s) { - return from_oct (p, s, "major_t", MAJOR_MAX); + return from_oct (p, s, "major_t", (uintmax_t) TYPE_MAXIMUM (major_t)); } minor_t minor_from_oct (const char *p, size_t s) { - return from_oct (p, s, "minor_t", MINOR_MAX); + return from_oct (p, s, "minor_t", (uintmax_t) TYPE_MAXIMUM (minor_t)); } mode_t mode_from_oct (const char *p, size_t s) { - return from_oct (p, s, "mode_t", MODE_MAX); + return from_oct (p, s, "mode_t", (uintmax_t) TYPE_MAXIMUM (mode_t)); } off_t off_from_oct (const char *p, size_t s) { - return from_oct (p, s, "off_t", OFF_MAX); + return from_oct (p, s, "off_t", (uintmax_t) TYPE_MAXIMUM (off_t)); } size_t size_from_oct (const char *p, size_t s) { - return from_oct (p, s, "size_t", SIZE_MAX); + return from_oct (p, s, "size_t", (uintmax_t) TYPE_MAXIMUM (size_t)); } time_t time_from_oct (const char *p, size_t s) { - return from_oct (p, s, "time_t", TIME_MAX); + return from_oct (p, s, "time_t", (uintmax_t) TYPE_MAXIMUM (time_t)); } uid_t uid_from_oct (const char *p, size_t s) { - return from_oct (p, s, "uid_t", UID_MAX); + return from_oct (p, s, "uid_t", (uintmax_t) TYPE_MAXIMUM (uid_t)); } uintmax_t uintmax_from_oct (const char *p, size_t s) { - return from_oct (p, s, "uintmax_t", UINTMAX_MAX); + return from_oct (p, s, "uintmax_t", TYPE_MAXIMUM (uintmax_t)); } @@ -730,7 +757,8 @@ print_header (void) { char modes[11]; char *timestamp; - char uform[11], gform[11]; /* these hold formatted ints */ + /* These hold formatted ints. */ + char uform[UINTMAX_STRSIZE_BOUND], gform[UINTMAX_STRSIZE_BOUND]; char *user, *group; char size[2 * UINTMAX_STRSIZE_BOUND]; /* holds formatted size or major,minor */