summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2005-03-03 23:15:04 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2005-03-03 23:15:04 (GMT)
commitf05d1c0099fa3f5a46b0d9b0eb709db3bbb6cf2f (patch)
treeacba36ffc123de7fe38d7015534587e3359a27fb
parenteb08d7e0d6e1d03fca2f694da31e795a9d35ff69 (diff)
downloadcpython-f05d1c0099fa3f5a46b0d9b0eb709db3bbb6cf2f.zip
cpython-f05d1c0099fa3f5a46b0d9b0eb709db3bbb6cf2f.tar.gz
cpython-f05d1c0099fa3f5a46b0d9b0eb709db3bbb6cf2f.tar.bz2
Patch #1103407: Properly deal with tarfile iterators when untarring
symbolic links on Windows. Fixes #1100429.
-rw-r--r--Lib/tarfile.py19
-rw-r--r--Misc/NEWS3
2 files changed, 18 insertions, 4 deletions
diff --git a/Lib/tarfile.py b/Lib/tarfile.py
index b85f117..4a57e3a 100644
--- a/Lib/tarfile.py
+++ b/Lib/tarfile.py
@@ -1840,6 +1840,7 @@ class TarIter:
"""Construct a TarIter object.
"""
self.tarfile = tarfile
+ self.index = 0
def __iter__(self):
"""Return iterator object.
"""
@@ -1848,10 +1849,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
diff --git a/Misc/NEWS b/Misc/NEWS
index b3cabe9..d5511eb 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -40,6 +40,9 @@ Extension Modules
Library
-------
+- Patch #1103407: Properly deal with tarfile iterators when untarring
+ symbolic links on Windows.
+
- Patch #1117454: Remove code to special-case cookies without values
in LWPCookieJar.