diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2010-01-05 06:43:21 +0300 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2010-01-05 06:43:21 +0300 |
commit | af1c8e8be070f2121d5d977c5ed7a7f60c03a6dc (patch) | |
tree | 7f0bc3627ab6b07baf8d8b835e5d47f5c9cb34c5 /archival/libunarchive/get_header_cpio.c | |
parent | 074e8dcba76ac2a313d6a14ca2289e648f926b25 (diff) |
cpio: fix unpacking of names with leading slashes
function old new delta
get_header_cpio 968 990 +22
cpio_main 533 526 -7
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'archival/libunarchive/get_header_cpio.c')
-rw-r--r-- | archival/libunarchive/get_header_cpio.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/archival/libunarchive/get_header_cpio.c b/archival/libunarchive/get_header_cpio.c index 302f12233..52854dff9 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 */ |