]> granicus.if.org Git - python/commitdiff
Patch #1103407: Properly deal with tarfile iterators when untarring
authorMartin v. Löwis <martin@v.loewis.de>
Thu, 3 Mar 2005 23:12:42 +0000 (23:12 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Thu, 3 Mar 2005 23:12:42 +0000 (23:12 +0000)
symbolic links on Windows. Fixes #1100429. Will backport to 2.4.

Lib/tarfile.py
Misc/NEWS

index 9bfad250cfb936cd75e93b34e1a4a2ff546f1791..06f3ab35d012c37002d0dbecc8e08ebe17d848b0 100644 (file)
@@ -1851,6 +1851,7 @@ class TarIter:
         """Construct a TarIter object.
         """
         self.tarfile = tarfile
+        self.index = 0
     def __iter__(self):
         """Return iterator object.
         """
@@ -1859,10 +1860,20 @@ class TarIter:
         """Return the next item using TarFile's next() method.
            When all members have been read, set TarFile as _loaded.
         """
-        tarinfo = self.tarfile.next()
-        if not tarinfo:
-            self.tarfile._loaded = True
-            raise StopIteration
+        # Fix for SF #1100429: Under rare circumstances it can
+        # happen that getmembers() is called during iteration,
+        # which will cause TarIter to stop prematurely.
+        if not self.tarfile._loaded:
+            tarinfo = self.tarfile.next()
+            if not tarinfo:
+                self.tarfile._loaded = True
+                raise StopIteration
+        else:
+            try:
+                tarinfo = self.tarfile.members[self.index]
+            except IndexError:
+                raise StopIteration
+        self.index += 1
         return tarinfo
 
 # Helper classes for sparse file support
index c6033dec31abb0ebda669a5e6c012799ac8512b1..4eb7bb15f127b208c15475dfb010140661893217 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -72,6 +72,9 @@ Extension Modules
 Library
 -------
 
+- Patch #1103407: Properly deal with tarfile iterators when untarring
+  symbolic links on Windows.
+
 - Patch #645894: Use getrusage for computing the time consumption in 
   profile.py if available.