tar: fix handling of tarballs with symlinks with size field != 0

This commit is contained in:
Denis Vlasenko
2008-07-20 17:10:43 +00:00
parent b9bbc40f64
commit adc772a5f2
3 changed files with 41 additions and 7 deletions

View File

@@ -266,26 +266,31 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle)
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 */

View File

@@ -8,7 +8,9 @@
void FAST_FUNC 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