From 637431bf145a4e35458219c18db843a054e0adf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Thu, 3 Mar 2005 23:12:42 +0000 Subject: Patch #1103407: Properly deal with tarfile iterators when untarring symbolic links on Windows. Fixes #1100429. Will backport to 2.4. --- Lib/tarfile.py | 19 +++++++++++++++---- Misc/NEWS | 3 +++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/Lib/tarfile.py b/Lib/tarfile.py index 9bfad25..06f3ab3 100644 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -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 diff --git a/Misc/NEWS b/Misc/NEWS index c6033de..4eb7bb15 100644 --- 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. -- cgit v0.12