From 7a0d9fb3eaa85f8dec5ba5e3bd6ecee681ab2816 Mon Sep 17 00:00:00 2001 From: sin Date: Wed, 22 Apr 2015 23:22:07 +0100 Subject: [PATCH] tar: Skip over data before processing the next entry When we selectively process entries from the archive, ensure that we jump over the data section of each uninteresting entry before going on to process the next entry. Not doing so, leaves the file stream pointer in the wrong place. --- tar.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tar.c b/tar.c index ccecff9..b2a4d9f 100644 --- a/tar.c +++ b/tar.c @@ -323,17 +323,22 @@ xt(int argc, char *argv[], int (*fn)(char *, ssize_t, char[BLKSIZ])) snprintf(fname + n, sizeof(fname) - n, "%.*s", (int)sizeof(h->name), h->name); + if ((size = strtol(h->size, &p, 8)) < 0 || *p != '\0') + eprintf("strtol %s: invalid number\n", h->size); + if (argc) { /* only extract the given files */ for (i = 0; i < argc; i++) if (!strcmp(argv[i], fname)) break; - if (i == argc) + if (i == argc) { + for (; size > 0; size -= BLKSIZ) + if (fread(b, BLKSIZ, 1, tarfile) != 1) + eprintf("fread %s:", tarfilename); continue; + } } - if ((size = strtol(h->size, &p, 8)) < 0 || *p != '\0') - eprintf("strtol %s: invalid number\n", h->size); fn(fname, size, b); } if (ferror(tarfile))