From e1f87da43e4805ac6758fa11cc49fbebaa5c3c89 Mon Sep 17 00:00:00 2001 From: Michael Forney Date: Sat, 1 Nov 2014 20:36:40 +0000 Subject: [PATCH] tar: Handle archives with the prefix field Also, handle names and prefixes that fill the entire field (and have no NUL byte) by using a precision specifier. --- tar.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tar.c b/tar.c index 7bd709d..0a41795 100644 --- a/tar.c +++ b/tar.c @@ -27,6 +27,7 @@ struct Header { char gname[32]; char major[8]; char minor[8]; + char prefix[155]; }; enum { @@ -298,11 +299,14 @@ c(const char * path) static void xt(int (*fn)(char*, int, char[Blksiz])) { - char b[Blksiz], fname[101]; + char b[Blksiz], fname[257], *s; Header *h = (void*)b; while(fread(b, Blksiz, 1, tarfile) && h->name[0] != '\0') { - snprintf(fname, sizeof fname, "%s", h->name); + s = fname; + if (h->prefix[0] != '\0') + s += sprintf(s, "%.*s/", (int)sizeof h->prefix, h->prefix); + sprintf(s, "%.*s", (int)sizeof h->name, h->name); fn(fname, strtol(h->size, 0, 8), b); } }