ttar-various-fixes.diff - mkports - recipes for building multiple softwares with mk(1)
 (HTM) git clone git://z3bra.org/mkports
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       ttar-various-fixes.diff (1994B)
       ---
            1 diff --git a/tar.c b/tar.c
            2 index 71719b0..5954047 100644
            3 --- a/tar.c
            4 +++ b/tar.c
            5 @@ -29,6 +30,12 @@ enum Type {
            6          RESERVED  = '7'
            7  };
            8  
            9 +enum Error {
           10 +        BADCHKSUM,
           11 +        BADMAGIC,
           12 +        BADPATH
           13 +};
           14 +
           15  struct header {
           16          char name[100];
           17          char mode[8];
           18 @@ -71,6 +78,12 @@ static const char *filtertools[] = {
           19          ['z'] = "gzip",
           20  };
           21  
           22 +static const char *errors[] = {
           23 +        [BADCHKSUM] = "bad checksum",
           24 +        [BADMAGIC]  = "bad magic",
           25 +        [BADPATH]   = "empty filename"
           26 +};
           27 +
           28  static void
           29  pushdirtime(char *name, time_t mtime)
           30  {
           31 @@ -143,16 +156,22 @@ decomp(int fd, const char *tool, const char *flags)
           32  static ssize_t
           33  eread(int fd, void *buf, size_t n)
           34  {
           35 -        ssize_t r;
           36 +        char *tmp = buf;
           37 +        ssize_t r, s = 0;
           38  
           39  again:
           40 -        r = read(fd, buf, n);
           41 +        r = read(fd, tmp + s, n - s);
           42          if (r < 0) {
           43 -                if (errno == EINTR)
           44 +                if (errno == EINTR || errno == EAGAIN)
           45                          goto again;
           46                  eprintf("read:");
           47          }
           48 -        return r;
           49 +
           50 +        s += r;
           51 +        if (r && s < n)
           52 +                goto again;
           53 +
           54 +        return s;
           55  }
           56  
           57  static ssize_t
           58 @@ -407,27 +427,36 @@ chktar(struct header *h)
           59          char tmp[8], *err;
           60          char *p = (char *)h;
           61          long s1, s2, i;
           62 +        int errnum;
           63  
           64 -        if (h->prefix[0] == '\0' && h->name[0] == '\0')
           65 +        if (h->prefix[0] == '\0' && h->name[0] == '\0') {
           66 +                errnum = BADPATH;
           67                  goto bad;
           68 -        if (h->magic[0] && strncmp("ustar", h->magic, 5))
           69 +        }
           70 +        if (h->magic[0] && strncmp("ustar", h->magic, 5)) {
           71 +                errnum = BADMAGIC;
           72                  goto bad;
           73 +        }
           74          memcpy(tmp, h->chksum, sizeof(tmp));
           75          for (i = 0; i < sizeof(tmp); i++)
           76                  if (tmp[i] == ' ')
           77                          tmp[i] = '\0';
           78          s1 = strtol(tmp, &err, 8);
           79 -        if (s1 < 0 || *err != '\0')
           80 +        if (s1 < 0 || *err != '\0') {
           81 +                errnum = BADCHKSUM;
           82                  goto bad;
           83 +        }
           84          memset(h->chksum, ' ', sizeof(h->chksum));
           85          for (i = 0, s2 = 0; i < sizeof(*h); i++)
           86                  s2 += (unsigned char)p[i];
           87 -        if (s1 != s2)
           88 +        if (s1 != s2) {
           89 +                errnum = BADCHKSUM;
           90                  goto bad;
           91 +        }
           92          memcpy(h->chksum, tmp, sizeof(h->chksum));
           93          return;
           94  bad:
           95 -        eprintf("malformed tar archive\n");
           96 +        eprintf("malformed tar archive: %s\n", errors[errnum]);
           97  }
           98  
           99  static void