mirror of
https://github.com/python/cpython.git
synced 2024-11-24 18:34:43 +08:00
Fix closes issue10761: tarfile.extractall failure when symlinked files are present.
This commit is contained in:
parent
bdfa2e69e2
commit
011525ee92
@ -2239,6 +2239,8 @@ class TarFile(object):
|
|||||||
if hasattr(os, "symlink") and hasattr(os, "link"):
|
if hasattr(os, "symlink") and hasattr(os, "link"):
|
||||||
# For systems that support symbolic and hard links.
|
# For systems that support symbolic and hard links.
|
||||||
if tarinfo.issym():
|
if tarinfo.issym():
|
||||||
|
if os.path.exists(targetpath):
|
||||||
|
os.unlink(targetpath)
|
||||||
os.symlink(tarinfo.linkname, targetpath)
|
os.symlink(tarinfo.linkname, targetpath)
|
||||||
else:
|
else:
|
||||||
# See extract().
|
# See extract().
|
||||||
|
@ -843,6 +843,33 @@ class WriteTest(WriteTestBase):
|
|||||||
finally:
|
finally:
|
||||||
os.chdir(cwd)
|
os.chdir(cwd)
|
||||||
|
|
||||||
|
def test_extractall_symlinks(self):
|
||||||
|
# Test if extractall works properly when tarfile contains symlinks
|
||||||
|
tempdir = os.path.join(TEMPDIR, "testsymlinks")
|
||||||
|
temparchive = os.path.join(TEMPDIR, "testsymlinks.tar")
|
||||||
|
os.mkdir(tempdir)
|
||||||
|
try:
|
||||||
|
source_file = os.path.join(tempdir,'source')
|
||||||
|
target_file = os.path.join(tempdir,'symlink')
|
||||||
|
with open(source_file,'w') as f:
|
||||||
|
f.write('something\n')
|
||||||
|
os.symlink(source_file, target_file)
|
||||||
|
tar = tarfile.open(temparchive,'w')
|
||||||
|
tar.add(source_file, arcname=os.path.basename(source_file))
|
||||||
|
tar.add(target_file, arcname=os.path.basename(target_file))
|
||||||
|
tar.close()
|
||||||
|
# Let's extract it to the location which contains the symlink
|
||||||
|
tar = tarfile.open(temparchive,'r')
|
||||||
|
# this should not raise OSError: [Errno 17] File exists
|
||||||
|
try:
|
||||||
|
tar.extractall(path=tempdir)
|
||||||
|
except OSError:
|
||||||
|
self.fail("extractall failed with symlinked files")
|
||||||
|
finally:
|
||||||
|
tar.close()
|
||||||
|
finally:
|
||||||
|
os.unlink(temparchive)
|
||||||
|
shutil.rmtree(tempdir)
|
||||||
|
|
||||||
class StreamWriteTest(WriteTestBase):
|
class StreamWriteTest(WriteTestBase):
|
||||||
|
|
||||||
|
@ -65,6 +65,9 @@ Core and Builtins
|
|||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #10761: Fix tarfile.extractall failure when symlinked files are
|
||||||
|
present. Initial patch by Scott Leerssen.
|
||||||
|
|
||||||
- Issue #11763: don't use difflib in TestCase.assertMultiLineEqual if the
|
- Issue #11763: don't use difflib in TestCase.assertMultiLineEqual if the
|
||||||
strings are too long.
|
strings are too long.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user