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
997ad2c64a 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:
		
				
					committed by
					
						
						Denys Vlasenko
					
				
			
			
				
	
			
			
			
						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;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user