[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