X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Ftar.c;h=10ba8a9b8a06bf2a9709008e6bf9a3d8d731f7bf;hb=c1b30c268f8517bfe61fe253a34613584351efc0;hp=5b61144c65c979fcb2c51b3e8918a59629a78fba;hpb=cc40c57a37b1e443a5088fdda0fbb3687b1f4773;p=chaz%2Ftar diff --git a/src/tar.c b/src/tar.c index 5b61144..10ba8a9 100644 --- a/src/tar.c +++ b/src/tar.c @@ -1364,6 +1364,8 @@ expand_pax_option (struct tar_args *targs, const char *arg) } +#define TAR_SIZE_SUFFIXES "bBcGgkKMmPTtw" + static error_t parse_opt (int key, char *arg, struct argp_state *state) { @@ -1506,10 +1508,15 @@ parse_opt (int key, char *arg, struct argp_state *state) case 'L': { uintmax_t u; - if (xstrtoumax (arg, 0, 10, &u, "") != LONGINT_OK) + char *p; + + if (xstrtoumax (arg, &p, 10, &u, TAR_SIZE_SUFFIXES) != LONGINT_OK) USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg), _("Invalid tape length"))); - tape_length_option = 1024 * (tarlong) u; + if (p > arg && !strchr (TAR_SIZE_SUFFIXES, p[-1])) + tape_length_option = 1024 * (tarlong) u; + else + tape_length_option = (tarlong) u; multi_volume_option = true; } break; @@ -1961,7 +1968,8 @@ parse_opt (int key, char *arg, struct argp_state *state) case RECORD_SIZE_OPTION: { uintmax_t u; - if (! (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK + + if (! (xstrtoumax (arg, NULL, 10, &u, TAR_SIZE_SUFFIXES) == LONGINT_OK && u == (size_t) u)) USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg), _("Invalid record size")));