changeset 373:9e2e6d04af86

Bugfix for busybox 1.11.1 dealing with mercurial archives with symlinks.
author Rob Landley <rob@landley.net>
date Sun, 20 Jul 2008 12:24:39 -0500
parents 37c8a6c9a493
children ed4caa451355
files sources/patches/busybox-1.11.1-tar.patch
diffstat 1 files changed, 53 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sources/patches/busybox-1.11.1-tar.patch	Sun Jul 20 12:24:39 2008 -0500
@@ -0,0 +1,53 @@
+--- busybox-1.11.1/archival/libunarchive/get_header_tar.c	Wed Jun 25 14:51:17 2008
++++ busybox-1.11.1-tar/archival/libunarchive/get_header_tar.c	Sun Jul 20 19:11:45 2008
+@@ -261,26 +261,31 @@
+ 	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':
++ set_dir:
+ 		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 */
+--- busybox-1.11.1/archival/libunarchive/seek_by_jump.c	Wed Jun 25 14:51:17 2008
++++ busybox-1.11.1-tar/archival/libunarchive/seek_by_jump.c	Sun Jul 20 19:11:45 2008
+@@ -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