diff options
-rw-r--r-- | archival/cpio.c | 2 | ||||
-rw-r--r-- | archival/libunarchive/get_header_cpio.c | 9 | ||||
-rwxr-xr-x | testsuite/cpio.tests | 4 |
3 files changed, 13 insertions, 2 deletions
diff --git a/archival/cpio.c b/archival/cpio.c index 5c16678..067d6e8 100644 --- a/archival/cpio.c +++ b/archival/cpio.c @@ -364,7 +364,7 @@ int cpio_main(int argc UNUSED_PARAM, char **argv) #endif archive_handle = init_handle(); - archive_handle->src_fd = STDIN_FILENO; + /* archive_handle->src_fd = STDIN_FILENO; - done by init_handle */ archive_handle->seek = seek_by_read; archive_handle->ah_flags = ARCHIVE_EXTRACT_NEWER; diff --git a/archival/libunarchive/get_header_cpio.c b/archival/libunarchive/get_header_cpio.c index 302f122..52854df 100644 --- a/archival/libunarchive/get_header_cpio.c +++ b/archival/libunarchive/get_header_cpio.c @@ -70,6 +70,15 @@ char FAST_FUNC get_header_cpio(archive_handle_t *archive_handle) file_header->name = xzalloc(namesize + 1); /* Read in filename */ xread(archive_handle->src_fd, file_header->name, namesize); + if (file_header->name[0] == '/') { + /* Testcase: echo /etc/hosts | cpio -pvd /tmp + * Without this code, it tries to unpack /etc/hosts + * into "/etc/hosts", not "etc/hosts". + */ + char *p = file_header->name; + do p++; while (*p == '/'); + overlapping_strcpy(file_header->name, p); + } archive_handle->offset += namesize; /* Update offset amount and skip padding before file contents */ diff --git a/testsuite/cpio.tests b/testsuite/cpio.tests index f21ba18..56f1885 100755 --- a/testsuite/cpio.tests +++ b/testsuite/cpio.tests @@ -36,6 +36,7 @@ ls -ln cpio.testdir | $FILTER_LS" \ "\ 1 blocks 0 +total 0 -rw-r--r-- 2 $user $group 0 x -rw-r--r-- 2 $user $group 0 y " \ @@ -47,10 +48,10 @@ test x"$SKIP_KNOWN_BUGS" = x"" && { testing "cpio lists hardlinks" \ "$ECHO -ne '$hexdump' | bzcat | cpio -t 2>&1; echo \$?" \ "\ -1 block cpio.testdir cpio.testdir/x cpio.testdir/y +1 blocks 0 " \ "" "" @@ -72,6 +73,7 @@ ls -ln cpio.testdir2/cpio.testdir | $FILTER_LS" \ "\ 2 blocks 0 +total 8 -rw-r--r-- 2 $user $group 0 empty -rw-r--r-- 2 $user $group 0 empty1 -rw-r--r-- 2 $user $group 2 nonempty |