Commit 42e00912 authored by Lars Gustäbel's avatar Lars Gustäbel

Merged revisions 70523 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r70523 | lars.gustaebel | 2009-03-22 21:09:33 +0100 (Sun, 22 Mar 2009) | 5 lines

  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.
........
parent db08306b
......@@ -639,12 +639,11 @@ class _BZ2Proxy(object):
def read(self, size):
x = len(self.buf)
while x < size:
try:
raw = self.fileobj.read(self.blocksize)
data = self.bz2obj.decompress(raw)
self.buf += data
except EOFError:
raw = self.fileobj.read(self.blocksize)
if not raw:
break
data = self.bz2obj.decompress(raw)
self.buf += data
x += len(data)
buf = self.buf[:size]
......
......@@ -1121,6 +1121,30 @@ class Bz2WriteTest(WriteTest):
class Bz2StreamWriteTest(StreamWriteTest):
mode = "w|bz2"
class Bz2PartialReadTest(unittest.TestCase):
# Issue5068: The _BZ2Proxy.read() method loops forever
# on an empty or partial bzipped file.
def _test_partial_input(self, mode):
class MyBytesIO(io.BytesIO):
hit_eof = False
def read(self, n):
if self.hit_eof:
raise AssertionError("infinite loop detected in tarfile.open()")
self.hit_eof = self.tell() == len(self.getvalue())
return super(MyBytesIO, self).read(n)
data = bz2.compress(tarfile.TarInfo("foo").tobuf())
for x in range(len(data) + 1):
tarfile.open(fileobj=MyBytesIO(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")
def test_main():
if not os.path.exists(TEMPDIR):
os.mkdir(TEMPDIR)
......@@ -1178,6 +1202,7 @@ def test_main():
Bz2StreamReadTest,
Bz2WriteTest,
Bz2StreamWriteTest,
Bz2PartialReadTest,
]
try:
......
......@@ -32,6 +32,11 @@ Core and Builtins
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.
- Issue #2110: Add support for thousands separator and 'n' type
specifier to Decimal.__format__
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment