From c6f213ade49a8591a2f6c815a73aed3babe0f566 Mon Sep 17 00:00:00 2001 From: Eugene Rudoy Date: Tue, 7 Nov 2017 08:03:36 +0100 Subject: unzip: fix content listing and filtering when -j is used Original Info-ZIP's unzip uses unstripped filenames while doing content listing and filtering, i.e. - in content listing mode -j is ignored completely - filtering is applied to non-stripped names, -j takes effect first while extracting the files 997ad2c64abbe931dffa3598b015c5de04e515cf strips path components a little bit too early resulting in behavior deviations. Fix it by doing stripping after listing/filtering. p.s. Info-ZIP's unzip behavior is the same as that of tar in --strip-components=NUM mode Signed-off-by: Eugene Rudoy Signed-off-by: Denys Vlasenko --- archival/unzip.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'archival/unzip.c') diff --git a/archival/unzip.c b/archival/unzip.c index 604166063..1ef4406d6 100644 --- a/archival/unzip.c +++ b/archival/unzip.c @@ -805,13 +805,6 @@ int unzip_main(int argc, char **argv) /* Guard against "/abspath", "/../" and similar attacks */ overlapping_strcpy(dst_fn, strip_unsafe_prefix(dst_fn)); - if (opts & OPT_j) /* Strip paths? */ - overlapping_strcpy(dst_fn, bb_basename(dst_fn)); - - /* Did this strip everything ("DIR/" case)? Then skip */ - if (!dst_fn[0]) - goto skip_cmpsize; - /* Filter zip entries */ if (find_list_entry(zreject, dst_fn) || (zaccept && !find_list_entry(zaccept, dst_fn)) @@ -876,6 +869,14 @@ int unzip_main(int argc, char **argv) /* Extracting to STDOUT */ goto do_extract; } + + /* Strip paths (after -l: unzip -lj a.zip lists full names) */ + if (opts & OPT_j) + overlapping_strcpy(dst_fn, bb_basename(dst_fn)); + /* Did this strip everything ("DIR/" case)? Then skip */ + if (!dst_fn[0]) + goto skip_cmpsize; + if (last_char_is(dst_fn, '/')) { int mode; -- cgit v1.2.3