[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