summaryrefslogtreecommitdiffstats
path: root/package/busybox/patches/902-tar.patch
blob: d9bf7cd0c63e1e9dceb850fb9b7c600022e02787 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
--- a/archival/libunarchive/get_header_tar.c
+++ b/archival/libunarchive/get_header_tar.c
@@ -261,26 +261,33 @@
 	case '0':
 #if ENABLE_FEATURE_TAR_OLDGNU_COMPATIBILITY
 		if (last_char_is(file_header->name, '/')) {
-			file_header->mode |= S_IFDIR;
-		} else
+			goto set_dir;
+		}
 #endif
 		file_header->mode |= S_IFREG;
 		break;
 	case '2':
 		file_header->mode |= S_IFLNK;
+		/* have seen tarballs with size field containing
+		 * the size of the link target's name */
+ size0:
+		file_header->size = 0;
 		break;
 	case '3':
 		file_header->mode |= S_IFCHR;
-		break;
+		goto size0; /* paranoia */
 	case '4':
 		file_header->mode |= S_IFBLK;
-		break;
+		goto size0;
 	case '5':
+#if ENABLE_FEATURE_TAR_OLDGNU_COMPATIBILITY
+ set_dir:
+#endif
 		file_header->mode |= S_IFDIR;
-		break;
+		goto size0;
 	case '6':
 		file_header->mode |= S_IFIFO;
-		break;
+		goto size0;
 #if ENABLE_FEATURE_TAR_GNU_EXTENSIONS
 	case 'L':
 		/* free: paranoia: tar with several consecutive longnames */
--- a/archival/libunarchive/seek_by_jump.c
+++ b/archival/libunarchive/seek_by_jump.c
@@ -8,7 +8,9 @@
 
 void seek_by_jump(const archive_handle_t *archive_handle, unsigned amount)
 {
-	if (lseek(archive_handle->src_fd, (off_t) amount, SEEK_CUR) == (off_t) -1) {
+	if (amount
+	 && lseek(archive_handle->src_fd, (off_t) amount, SEEK_CUR) == (off_t) -1
+	) {
 		if (errno == ESPIPE)
 			seek_by_read(archive_handle, amount);
 		else