bpo-12800: tarfile: Restore fix from 011525ee9 (GH-21409)

Restore fix from 011525ee92.
This commit is contained in:
Julien Palard 2020-11-25 10:23:17 +01:00 committed by GitHub
parent c9c6e9f89a
commit 4fedd7123e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 10 additions and 3 deletions

View File

@ -2237,6 +2237,9 @@ class TarFile(object):
try: try:
# 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.lexists(targetpath):
# Avoid FileExistsError on following os.symlink.
os.unlink(targetpath)
os.symlink(tarinfo.linkname, targetpath) os.symlink(tarinfo.linkname, targetpath)
else: else:
# See extract(). # See extract().

View File

@ -1347,10 +1347,10 @@ class WriteTest(WriteTestBase, unittest.TestCase):
f.write('something\n') f.write('something\n')
os.symlink(source_file, target_file) os.symlink(source_file, target_file)
with tarfile.open(temparchive, 'w') as tar: with tarfile.open(temparchive, 'w') as tar:
tar.add(source_file) tar.add(source_file, arcname="source")
tar.add(target_file) tar.add(target_file, arcname="symlink")
# Let's extract it to the location which contains the symlink # Let's extract it to the location which contains the symlink
with tarfile.open(temparchive) as tar: with tarfile.open(temparchive, errorlevel=2) as tar:
# this should not raise OSError: [Errno 17] File exists # this should not raise OSError: [Errno 17] File exists
try: try:
tar.extractall(path=tempdir) tar.extractall(path=tempdir)

View File

@ -0,0 +1,4 @@
Extracting a symlink from a tarball should succeed and overwrite the symlink
if it already exists. The fix is to remove the existing file or symlink
before extraction. Based on patch by Chris AtLee, Jeffrey Kintscher, and
Senthil Kumaran.