diff options
author | Philip Guenther <guenther@cvs.openbsd.org> | 2013-04-11 00:44:27 +0000 |
---|---|---|
committer | Philip Guenther <guenther@cvs.openbsd.org> | 2013-04-11 00:44:27 +0000 |
commit | 51413dc1528c5ef2a0199fcedd276c6542954b92 (patch) | |
tree | 9ed30c11d9057e9c3249e838e473734ab19cc42a /bin | |
parent | 0bbb3ff6984f408f9018091b2d9bc33fbf3c506b (diff) |
The tweaks I suggested to the previous diff resulted in the typeflag
being checked after it was overwritten by the next block read in.
Eliminate the argument aliasing that led to this being overlooked
by passing rd_xheader() the size and typeflag directly.
problem discovery and ok fgsch@
Diffstat (limited to 'bin')
-rw-r--r-- | bin/pax/tar.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/bin/pax/tar.c b/bin/pax/tar.c index ec4c809b6ba..0823825bf4b 100644 --- a/bin/pax/tar.c +++ b/bin/pax/tar.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tar.c,v 1.46 2013/04/09 18:30:34 fgsch Exp $ */ +/* $OpenBSD: tar.c,v 1.47 2013/04/11 00:44:26 guenther Exp $ */ /* $NetBSD: tar.c,v 1.5 1995/03/21 09:07:49 cgd Exp $ */ /*- @@ -60,7 +60,7 @@ static int ul_oct(u_long, char *, int, int); static int uqd_oct(u_quad_t, char *, int, int); #endif #ifndef SMALL -static int rd_xheader(ARCHD *, char *, HD_USTAR **); +static int rd_xheader(ARCHD *, char *, off_t, char); #endif static uid_t uid_nobody; @@ -760,7 +760,9 @@ ustar_rd(ARCHD *arcn, char *buf) #ifndef SMALL /* Process the Extended header. */ if (hd->typeflag == XHDRTYPE || hd->typeflag == GHDRTYPE) { - if (rd_xheader(arcn, buf, &hd) < 0) + if (rd_xheader(arcn, buf, + (off_t)asc_ul(hd->size, sizeof(hd->size), OCT), + hd->typeflag) < 0) return (-1); } #endif @@ -1204,13 +1206,12 @@ expandname(char *buf, size_t len, char **gnu_name, const char *name, #define MINXHDRSZ 6 static int -rd_xheader(ARCHD *arcn, char *buf, HD_USTAR **hd) +rd_xheader(ARCHD *arcn, char *buf, off_t size, char typeflag) { - off_t len, size; + off_t len; char *delim, *keyword; char *nextp, *p; - size = (off_t)asc_ul((*hd)->size, sizeof((*hd)->size), OCT); if (size < MINXHDRSZ) { paxwarn(1, "Invalid extended header length"); return (-1); @@ -1246,7 +1247,7 @@ rd_xheader(ARCHD *arcn, char *buf, HD_USTAR **hd) return (-1); } *p++ = nextp[-1] = '\0'; - if ((*hd)->typeflag == XHDRTYPE) { + if (typeflag == XHDRTYPE) { if (!strcmp(keyword, "path")) { arcn->nlen = strlcpy(arcn->name, p, sizeof(arcn->name)); @@ -1260,7 +1261,6 @@ rd_xheader(ARCHD *arcn, char *buf, HD_USTAR **hd) /* Update the ustar header. */ if (rd_wrbuf(buf, BLKMULT) != BLKMULT) return (-1); - *hd = (HD_USTAR *)buf; return (0); } #endif |