6202362 Solaris tar can't unpack files created with GNU tar
authorRich Burridge <rich.burridge@sun.com>
Thu, 25 Mar 2010 13:21:39 -0700
changeset 11995 caff1bd711f5
parent 11994 5cb9130500d6
child 11996 91b62f7b8186
6202362 Solaris tar can't unpack files created with GNU tar
usr/src/cmd/tar/tar.c
--- a/usr/src/cmd/tar/tar.c	Thu Mar 25 13:53:44 2010 -0400
+++ b/usr/src/cmd/tar/tar.c	Thu Mar 25 13:21:39 2010 -0700
@@ -1543,10 +1543,11 @@
 			break;
 		}
 
-	if (dblock.dbuf.typeflag == 'X')
+	if ((dblock.dbuf.typeflag == 'X') || (dblock.dbuf.typeflag == 'L')) {
 		Xhdrflag = 1;	/* Currently processing extended header */
-	else
+	} else {
 		Xhdrflag = 0;
+	}
 
 	sp->st_uid = Gen.g_uid;
 	sp->st_gid = Gen.g_gid;
@@ -2722,6 +2723,7 @@
 	    (dblock.dbuf.typeflag != '2') && (dblock.dbuf.typeflag != '3') &&
 	    (dblock.dbuf.typeflag != '4') && (dblock.dbuf.typeflag != '5') &&
 	    (dblock.dbuf.typeflag != '6') && (dblock.dbuf.typeflag != 'A') &&
+	    (dblock.dbuf.typeflag != 'L') &&
 	    (dblock.dbuf.typeflag != _XATTR_HDRTYPE) &&
 	    (dblock.dbuf.typeflag != 'X')) {
 		return (1);
@@ -6753,7 +6755,7 @@
 /*
  * Read the data record for extended headers and then the regular header.
  * The data are read into the buffer and then null-terminated.  Entries
- * are of the format:
+ * for typeflag 'X' extended headers are of the format:
  * 	"%d %s=%s\n"
  *
  * When an extended header record is found, the extended header must
@@ -6810,11 +6812,17 @@
 	lineloc = xrec_ptr;
 	xrec_ptr[stbuf.st_size] = '\0';
 	while (lineloc < xrec_ptr + stbuf.st_size) {
-		length = atoi(lineloc);
-		*(lineloc + length - 1) = '\0';
-		keyword = strchr(lineloc, ' ') + 1;
-		value = strchr(keyword, '=') + 1;
-		*(value - 1) = '\0';
+		if (dblock.dbuf.typeflag == 'L') {
+			length = xrec_size;
+			keyword = "path";
+			value = lineloc;
+		} else {
+			length = atoi(lineloc);
+			*(lineloc + length - 1) = '\0';
+			keyword = strchr(lineloc, ' ') + 1;
+			value = strchr(keyword, '=') + 1;
+			*(value - 1) = '\0';
+		}
 		i = 0;
 		lineloc += length;
 		while (keylist_pair[i].keynum != (int)_X_LAST) {