diff options
author | Lars Gustäbel <lars@gustaebel.de> | 2009-03-22 20:09:33 (GMT) |
---|---|---|
committer | Lars Gustäbel <lars@gustaebel.de> | 2009-03-22 20:09:33 (GMT) |
commit | 2020a59563caeda95023307a4c830fe03c338990 (patch) | |
tree | dbd8152d0b445bbebd60a48eecaadf0fdc687a37 /Lib/test/test_tarfile.py | |
parent | b364bfe2f406a99a83fc5b1073726ecbaa63f50f (diff) | |
download | cpython-2020a59563caeda95023307a4c830fe03c338990.zip cpython-2020a59563caeda95023307a4c830fe03c338990.tar.gz cpython-2020a59563caeda95023307a4c830fe03c338990.tar.bz2 |
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.
Diffstat (limited to 'Lib/test/test_tarfile.py')
-rw-r--r-- | Lib/test/test_tarfile.py | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index f5c9ed4..ee68118 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -1140,6 +1140,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 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") + + def test_main(): if not os.path.exists(TEMPDIR): os.mkdir(TEMPDIR) @@ -1196,6 +1220,7 @@ def test_main(): Bz2StreamReadTest, Bz2WriteTest, Bz2StreamWriteTest, + Bz2PartialReadTest, ] try: |