tsbase: patches to fix tar bug - mkports - recipes for building multiple softwares with mk(1)
(HTM) git clone git://z3bra.org/mkports
(DIR) Log
(DIR) Files
(DIR) Refs
---
(DIR) commit aafc389decda0d3a3aba8a1d01cf99f97d3b8952
(DIR) parent 1f4c68cf6443f28efa46fc98bfd6c46c34f2862a
(HTM) Author: z3bra <contactatz3bradotorg>
Date: Fri, 3 Feb 2017 18:19:11 +0100
sbase: patches to fix tar bug
Diffstat:
A sbase/patches/sbase-tarformaterror… | 72 +++++++++++++++++++++++++++++++
A sbase/patches/sbase-tarreadall-201… | 29 +++++++++++++++++++++++++++++
2 files changed, 101 insertions(+), 0 deletions(-)
---
(DIR) diff --git a/sbase/patches/sbase-tarformaterrors-20170203-3bc2ffc.diff b/sbase/patches/sbase-tarformaterrors-20170203-3bc2ffc.diff
t@@ -0,0 +1,72 @@
+diff --git a/tar.c b/tar.c
+index 71719b0..4a81f8f 100644
+--- a/tar.c
++++ b/tar.c
+@@ -29,6 +29,12 @@ enum Type {
+ RESERVED = '7'
+ };
+
++enum Error {
++ BADCHKSUM,
++ BADMAGIC,
++ BADPATH
++};
++
+ struct header {
+ char name[100];
+ char mode[8];
+@@ -71,6 +77,12 @@ static const char *filtertools[] = {
+ ['z'] = "gzip",
+ };
+
++static const char *errors[] = {
++ [BADCHKSUM] = "bad checksum",
++ [BADMAGIC] = "bad magic",
++ [BADPATH] = "empty filename"
++};
++
+ static void
+ pushdirtime(char *name, time_t mtime)
+ {
+@@ -407,27 +419,36 @@ chktar(struct header *h)
+ char tmp[8], *err;
+ char *p = (char *)h;
+ long s1, s2, i;
++ int errnum;
+
+- if (h->prefix[0] == '\0' && h->name[0] == '\0')
++ if (h->prefix[0] == '\0' && h->name[0] == '\0') {
++ errnum = BADPATH;
+ goto bad;
+- if (h->magic[0] && strncmp("ustar", h->magic, 5))
++ }
++ if (h->magic[0] && strncmp("ustar", h->magic, 5)) {
++ errnum = BADMAGIC;
+ goto bad;
++ }
+ memcpy(tmp, h->chksum, sizeof(tmp));
+ for (i = 0; i < sizeof(tmp); i++)
+ if (tmp[i] == ' ')
+ tmp[i] = '\0';
+ s1 = strtol(tmp, &err, 8);
+- if (s1 < 0 || *err != '\0')
++ if (s1 < 0 || *err != '\0') {
++ errnum = BADCHKSUM;
+ goto bad;
++ }
+ memset(h->chksum, ' ', sizeof(h->chksum));
+ for (i = 0, s2 = 0; i < sizeof(*h); i++)
+ s2 += (unsigned char)p[i];
+- if (s1 != s2)
++ if (s1 != s2) {
++ errnum = BADCHKSUM;
+ goto bad;
++ }
+ memcpy(h->chksum, tmp, sizeof(h->chksum));
+ return;
+ bad:
+- eprintf("malformed tar archive\n");
++ eprintf("malformed tar archive: %s\n", errors[errnum]);
+ }
+
+ static void
(DIR) diff --git a/sbase/patches/sbase-tarreadall-20170203-3bc2ffc.diff b/sbase/patches/sbase-tarreadall-20170203-3bc2ffc.diff
t@@ -0,0 +1,29 @@
+diff --git a/tar.c b/tar.c
+index 4a81f8f..f2649f1 100644
+--- a/tar.c
++++ b/tar.c
+@@ -155,16 +155,21 @@ decomp(int fd, const char *tool, const char *flags)
+ static ssize_t
+ eread(int fd, void *buf, size_t n)
+ {
+- ssize_t r;
++ char *tmp = buf;
++ ssize_t r, s = 0;
+
+ again:
+- r = read(fd, buf, n);
++ r = read(fd, tmp + s, n - s);
++ s += r;
+ if (r < 0) {
+ if (errno == EINTR)
+ goto again;
+ eprintf("read:");
+ }
+- return r;
++ if (s < n)
++ goto again;
++
++ return s;
+ }
+
+ static ssize_t