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 <gene.devel@gmail.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
0a67722140
commit
c6f213ade4
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user