[Python-checkins] cpython (2.7): Fix closes issue10761: tarfile.extractall failure when symlinked files are
senthil.kumaran
python-checkins at python.org
Thu Apr 28 09:32:16 CEST 2011
http://hg.python.org/cpython/rev/0c8bc3a0130a
changeset: 69653:0c8bc3a0130a
branch: 2.7
user: Senthil Kumaran <orsenthil at gmail.com>
date: Thu Apr 28 15:30:31 2011 +0800
summary:
Fix closes issue10761: tarfile.extractall failure when symlinked files are present.
files:
Lib/tarfile.py | 2 ++
Lib/test/test_tarfile.py | 27 +++++++++++++++++++++++++++
Misc/NEWS | 3 +++
3 files changed, 32 insertions(+), 0 deletions(-)
diff --git a/Lib/tarfile.py b/Lib/tarfile.py
--- a/Lib/tarfile.py
+++ b/Lib/tarfile.py
@@ -2239,6 +2239,8 @@
if hasattr(os, "symlink") and hasattr(os, "link"):
# For systems that support symbolic and hard links.
if tarinfo.issym():
+ if os.path.exists(targetpath):
+ 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
--- a/Lib/test/test_tarfile.py
+++ b/Lib/test/test_tarfile.py
@@ -843,6 +843,33 @@
finally:
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):
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -65,6 +65,9 @@
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
strings are too long.
--
Repository URL: http://hg.python.org/cpython
More information about the Python-checkins
mailing list