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

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


Author: lars.gustaebel
Date: Sun Mar 22 21:39:38 2009
New Revision: 70526
Log:
Merged revisions 70525 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/branches/py3k
................
 r70525 | lars.gustaebel | 2009年03月22日 21:34:29 +0100 (2009年3月22日) | 12 lines
 
 Merged revisions 70523 via svnmerge from 
 svn+ssh://pythondev@svn.python.org/python/trunk
 
 ........
 r70523 | lars.gustaebel | 2009年03月22日 21:09:33 +0100 (2009年3月22日) | 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.
 ........
................
Modified:
 python/branches/release30-maint/ (props changed)
 python/branches/release30-maint/Lib/tarfile.py
 python/branches/release30-maint/Lib/test/test_tarfile.py
 python/branches/release30-maint/Misc/NEWS
Modified: python/branches/release30-maint/Lib/tarfile.py
==============================================================================
--- python/branches/release30-maint/Lib/tarfile.py	(original)
+++ python/branches/release30-maint/Lib/tarfile.py	Sun Mar 22 21:39:38 2009
@@ -639,12 +639,11 @@
 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]
Modified: python/branches/release30-maint/Lib/test/test_tarfile.py
==============================================================================
--- python/branches/release30-maint/Lib/test/test_tarfile.py	(original)
+++ python/branches/release30-maint/Lib/test/test_tarfile.py	Sun Mar 22 21:39:38 2009
@@ -1121,6 +1121,30 @@
 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 @@
 Bz2StreamReadTest,
 Bz2WriteTest,
 Bz2StreamWriteTest,
+ Bz2PartialReadTest,
 ]
 
 try:
Modified: python/branches/release30-maint/Misc/NEWS
==============================================================================
--- python/branches/release30-maint/Misc/NEWS	(original)
+++ python/branches/release30-maint/Misc/NEWS	Sun Mar 22 21:39:38 2009
@@ -24,6 +24,11 @@
 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.
+
 - Fix Decimal.__format__ bug that swapped the meanings of the '<' and
 '>' alignment characters.
 


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /