[Python-checkins] r70527 - in python/branches/release25-maint: Lib/tarfile.py Lib/test/test_tarfile.py Misc/NEWS

lars.gustaebel python-checkins at python.org
Sun Mar 22 21:48:05 CET 2009


Author: lars.gustaebel
Date: Sun Mar 22 21:48:03 2009
New Revision: 70527

Log:
Issue #5068: Fixed the tarfile._BZ2Proxy.read() method that would loop
forever on incomplete input. That caused tarfile.open() to hang when used
with mode 'r' or 'r:bz2' and a fileobj argument that contained no data or
partial bzip2 compressed data.

(backported from r70523)


Modified:
   python/branches/release25-maint/Lib/tarfile.py
   python/branches/release25-maint/Lib/test/test_tarfile.py
   python/branches/release25-maint/Misc/NEWS

Modified: python/branches/release25-maint/Lib/tarfile.py
==============================================================================
--- python/branches/release25-maint/Lib/tarfile.py	(original)
+++ python/branches/release25-maint/Lib/tarfile.py	Sun Mar 22 21:48:03 2009
@@ -594,12 +594,11 @@
         b = [self.buf]
         x = len(self.buf)
         while x < size:
-            try:
-                raw = self.fileobj.read(self.blocksize)
-                data = self.bz2obj.decompress(raw)
-                b.append(data)
-            except EOFError:
+            raw = self.fileobj.read(self.blocksize)
+            if not raw:
                 break
+            data = self.bz2obj.decompress(raw)
+            b.append(data)
             x += len(data)
         self.buf = "".join(b)
 

Modified: python/branches/release25-maint/Lib/test/test_tarfile.py
==============================================================================
--- python/branches/release25-maint/Lib/test/test_tarfile.py	(original)
+++ python/branches/release25-maint/Lib/test/test_tarfile.py	Sun Mar 22 21:48:03 2009
@@ -751,6 +751,29 @@
     class ReadFileobjTestBzip2(ReadFileobjTest):
         comp = "bz2"
 
+    class PartialReadTestBzip2(unittest.TestCase):
+        # Issue5068: The _BZ2Proxy.read() method loops forever
+        # on an empty or partial bzipped file.
+
+        def _test_partial_input(self, mode):
+            class MyStringIO(StringIO.StringIO):
+                hit_eof = False
+                def read(self, n):
+                    if self.hit_eof:
+                        raise AssertionError("infinite loop detected in tarfile.open()")
+                    self.hit_eof = self.pos == self.len
+                    return StringIO.StringIO.read(self, n)
+
+            data = bz2.compress(tarfile.TarInfo("foo").tobuf())
+            for x in range(len(data) + 1):
+                tarfile.open(fileobj=MyStringIO(data[:x]), mode=mode)
+
+        def test_partial_input(self):
+            self._test_partial_input("r")
+
+        def test_partial_input_bz2(self):
+            self._test_partial_input("r:bz2")
+
 # If importing gzip failed, discard the Gzip TestCases.
 if not gzip:
     del ReadTestGzip
@@ -811,7 +834,7 @@
             WriteTestBzip2, WriteStreamTestBzip2,
             ReadDetectTestBzip2, ReadDetectFileobjTestBzip2,
             ReadAsteriskTestBzip2, ReadStreamAsteriskTestBzip2,
-            ReadFileobjTestBzip2
+            ReadFileobjTestBzip2, PartialReadTestBzip2
         ])
     try:
         test_support.run_unittest(*tests)

Modified: python/branches/release25-maint/Misc/NEWS
==============================================================================
--- python/branches/release25-maint/Misc/NEWS	(original)
+++ python/branches/release25-maint/Misc/NEWS	Sun Mar 22 21:48:03 2009
@@ -4,6 +4,20 @@
 
 (editors: check NEWS.help for information about editing NEWS using ReST.)
 
+What's New in Python 2.5.5?
+===========================
+
+*Release date: XX-XXX-20XX*
+
+Library
+-------
+
+- Issue #5068: Fixed the tarfile._BZ2Proxy.read() method that would loop
+  forever on incomplete input. That caused tarfile.open() to hang when used
+  with mode 'r' or 'r:bz2' and a fileobj argument that contained no data or
+  partial bzip2 compressed data.
+
+
 What's New in Python 2.5.4?
 ===========================
 


More information about the Python-checkins mailing list