summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJulien Palard <julien@palard.fr>2020-11-25 09:23:17 (GMT)
committerGitHub <noreply@github.com>2020-11-25 09:23:17 (GMT)
commit4fedd7123eaf147edd55eabbbd72e0bcc8368e47 (patch)
treefc8ea4cf109b749c519ad1e86defde9ee8fbbfce
parentc9c6e9f89aa68ce8094393a1a5575b67d26bc8c8 (diff)
downloadcpython-4fedd7123eaf147edd55eabbbd72e0bcc8368e47.zip
cpython-4fedd7123eaf147edd55eabbbd72e0bcc8368e47.tar.gz
cpython-4fedd7123eaf147edd55eabbbd72e0bcc8368e47.tar.bz2
bpo-12800: tarfile: Restore fix from 011525ee9 (GH-21409)
Restore fix from 011525ee92eb1c13ad1a62d28725a840e28f8160.
-rwxr-xr-xLib/tarfile.py3
-rw-r--r--Lib/test/test_tarfile.py6
-rw-r--r--Misc/NEWS.d/next/Library/2020-07-09-11-32-28.bpo-12800.fNgWwx.rst4
3 files changed, 10 insertions, 3 deletions
diff --git a/Lib/tarfile.py b/Lib/tarfile.py
index e422794..1d15612 100755
--- a/Lib/tarfile.py
+++ b/Lib/tarfile.py
@@ -2237,6 +2237,9 @@ class TarFile(object):
try:
# For systems that support symbolic and hard links.
if tarinfo.issym():
+ if os.path.lexists(targetpath):
+ # Avoid FileExistsError on following os.symlink.
+ os.unlink(targetpath)
os.symlink(tarinfo.linkname, targetpath)
else:
# See extract().
diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py
index 7b34d53..77ad830 100644
--- a/Lib/test/test_tarfile.py
+++ b/Lib/test/test_tarfile.py
@@ -1347,10 +1347,10 @@ class WriteTest(WriteTestBase, unittest.TestCase):
f.write('something\n')
os.symlink(source_file, target_file)
with tarfile.open(temparchive, 'w') as tar:
- tar.add(source_file)
- tar.add(target_file)
+ tar.add(source_file, arcname="source")
+ tar.add(target_file, arcname="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
try:
tar.extractall(path=tempdir)
diff --git a/Misc/NEWS.d/next/Library/2020-07-09-11-32-28.bpo-12800.fNgWwx.rst b/Misc/NEWS.d/next/Library/2020-07-09-11-32-28.bpo-12800.fNgWwx.rst
new file mode 100644
index 0000000..fdd7c5e
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-07-09-11-32-28.bpo-12800.fNgWwx.rst
@@ -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.