--- 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 Wed Jul 23 02:16:24 2008 @@ -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 */ --- 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