fix a bug detecting end of an archive when reading a POSIX archive containing a long (>100 byte) directory name. this caused premature exit of tar x or tar t on some POSIX archives. it's my bug; sorry. Reference: /n/sources/patch/applied/tar-posix-exit Date: Wed Dec 1 15:21:25 CET 2004 --- /sys/src/cmd/tar.c Wed Dec 1 15:21:26 2004 +++ /sys/src/cmd/tar.c Wed Dec 1 15:21:26 2004 @@ -126,7 +126,7 @@ if (fullname != nil) free(fullname); namlen = strnlen(hp->name, sizeof hp->name); - if (hp->prefix[0] == '\0' || !ustar) { + if (hp->prefix[0] == '\0' || !ustar) { /* old-style name? */ fullname = malloc(namlen + 1); if (fullname == nil) sysfatal("out of memory: %r"); @@ -369,9 +369,15 @@ } int +isendtar(void) +{ + return fullname[0] == '\0'; +} + +int endtar(void) { - if (dblock.dbuf.name[0] == '\0') { + if (isendtar()) { backtar(); return(1); } @@ -385,7 +391,9 @@ Dir *sp; readtar((char*)&dblock); - if (dblock.dbuf.name[0] == '\0') + ustar = isustar(&dblock.dbuf); + getfullname(&dblock.dbuf); + if (isendtar()) return; if(stbuf == nil){ stbuf = malloc(sizeof(Dir)); @@ -402,8 +410,6 @@ if (chksum != checksum()) sysfatal("header checksum error"); sp->qid.type = 0; - ustar = isustar(&dblock.dbuf); - getfullname(&dblock.dbuf); /* the mode test is ugly but sometimes necessary */ if (dblock.dbuf.linkflag == LF_DIR || (sp->mode&0170000) == 040000 || strrchr(fullname, '\0')[-1] == '/') { @@ -463,7 +469,8 @@ if (stbuf->qid.type & QTDIR) { /* Directory */ - for (i = 0, cp = buf; *cp++ = longname[i++];); + for (i = 0, cp = buf; *cp++ = longname[i++];) + ; *--cp = '/'; *++cp = 0; stbuf->length = 0;