@@ -2059,8 +2059,6 @@ def test_make_zipfile_rootdir_nodir(self):
20592059 def check_unpack_archive (self , format , ** kwargs ):
20602060 self .check_unpack_archive_with_converter (
20612061 format , lambda path : path , ** kwargs )
2062- self .check_unpack_archive_with_converter (
2063- format , FakePath , ** kwargs )
20642062 self .check_unpack_archive_with_converter (format , FakePath , ** kwargs )
20652063
20662064 def check_unpack_archive_with_converter (self , format , converter , ** kwargs ):
@@ -2116,6 +2114,71 @@ def test_unpack_archive_zip(self):
21162114 with self .assertRaises (TypeError ):
21172115 self .check_unpack_archive ('zip' , filter = 'data' )
21182116
2117+ def test_unpack_archive_zip_badpaths (self ):
2118+ srcdir = self .mkdtemp ()
2119+ zipname = os .path .join (srcdir , 'test.zip' )
2120+ abspath = os .path .join (srcdir , 'abspath' )
2121+ with zipfile .ZipFile (zipname , 'w' ) as zf :
2122+ zf .writestr (abspath , 'badfile' )
2123+ zf .writestr (os .sep + abspath , 'badfile' )
2124+ zf .writestr ('/abspath' , 'badfile' )
2125+ zf .writestr ('C:/abspath' , 'badfile' )
2126+ zf .writestr ('D:\\ abspath' , 'badfile' )
2127+ zf .writestr ('E:abspath' , 'badfile' )
2128+ zf .writestr ('F:/G:/abspath' , 'badfile' )
2129+ zf .writestr ('//server/share/abspath' , 'badfile' )
2130+ zf .writestr ('\\ \\ server2\\ share\\ abspath' , 'badfile' )
2131+ zf .writestr ('../relpath' , 'badfile' )
2132+ zf .writestr (os .pardir + os .sep + 'relpath2' , 'badfile' )
2133+ zf .writestr ('good/file' , 'goodfile' )
2134+ zf .writestr ('good..file' , 'goodfile' )
2135+
2136+ dstdir = os .path .join (self .mkdtemp (), 'dst' )
2137+ unpack_archive (zipname , dstdir )
2138+ self .assertTrue (os .path .isfile (os .path .join (dstdir , 'good' , 'file' )))
2139+ self .assertTrue (os .path .isfile (os .path .join (dstdir , 'good..file' )))
2140+ self .assertFalse (os .path .exists (abspath ))
2141+ self .assertFalse (os .path .exists (os .path .join (dstdir , 'abspath' )))
2142+ self .assertFalse (os .path .exists (os .path .join (dstdir , 'G_' )))
2143+ self .assertFalse (os .path .exists (os .path .join (dstdir , 'server' )))
2144+ if os .name != 'nt' :
2145+ self .assertTrue (os .path .isfile (os .path .join (dstdir , 'C:' , 'abspath' )))
2146+ self .assertTrue (os .path .isfile (os .path .join (dstdir , 'D:\\ abspath' )))
2147+ self .assertTrue (os .path .isfile (os .path .join (dstdir , 'E:abspath' )))
2148+ self .assertTrue (os .path .isfile (os .path .join (dstdir , 'F:' , 'G:' , 'abspath' )))
2149+ self .assertTrue (os .path .isfile (os .path .join (dstdir , '\\ \\ server2\\ share\\ abspath' )))
2150+ if os .pardir == '..' :
2151+ self .assertFalse (os .path .exists (os .path .join (dstdir , '..' , 'relpath' )))
2152+ self .assertFalse (os .path .exists (os .path .join (dstdir , 'relpath' )))
2153+ else :
2154+ self .assertTrue (os .path .isfile (os .path .join (dstdir , '..' , 'relpath' )))
2155+ self .assertFalse (os .path .exists (os .path .join (dstdir , os .pardir , 'relpath2' )))
2156+ self .assertFalse (os .path .exists (os .path .join (dstdir , 'relpath2' )))
2157+
2158+ dstdir2 = os .path .join (self .mkdtemp (), 'dst' )
2159+ os .mkdir (dstdir2 )
2160+ with os_helper .change_cwd (dstdir2 ):
2161+ unpack_archive (zipname , '' )
2162+ self .assertTrue (os .path .isfile (os .path .join ('good' , 'file' )))
2163+ self .assertTrue (os .path .isfile ('good..file' ))
2164+ self .assertFalse (os .path .exists (abspath ))
2165+ self .assertFalse (os .path .exists ('abspath' ))
2166+ self .assertFalse (os .path .exists ('C_' ))
2167+ self .assertFalse (os .path .exists ('server' ))
2168+ if os .name != 'nt' :
2169+ self .assertTrue (os .path .isfile (os .path .join ('C:' , 'abspath' )))
2170+ self .assertTrue (os .path .isfile ('D:\\ abspath' ))
2171+ self .assertTrue (os .path .isfile ('E:abspath' ))
2172+ self .assertTrue (os .path .isfile (os .path .join ('F:' , 'G:' , 'abspath' )))
2173+ self .assertTrue (os .path .isfile ('\\ \\ server2\\ share\\ abspath' ))
2174+ if os .pardir == '..' :
2175+ self .assertFalse (os .path .exists (os .path .join ('..' , 'relpath' )))
2176+ self .assertFalse (os .path .exists ('relpath' ))
2177+ else :
2178+ self .assertTrue (os .path .isfile (os .path .join ('..' , 'relpath' )))
2179+ self .assertFalse (os .path .exists (os .path .join (os .pardir , 'relpath2' )))
2180+ self .assertFalse (os .path .exists ('relpath2' ))
2181+
21192182 def test_unpack_registry (self ):
21202183
21212184 formats = get_unpack_formats ()
0 commit comments