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