Merge with 3.2: Correctly detect bzip2 compressed streams with blocksizes other than 900k.

This commit is contained in:
Lars Gustäbel 2011-12-06 13:00:58 +01:00
commit 45fb082180
3 changed files with 22 additions and 5 deletions

View File

@ -624,7 +624,7 @@ class _StreamProxy(object):
def getcomptype(self):
if self.buf.startswith(b"\037\213\010"):
return "gz"
if self.buf.startswith(b"BZh91"):
if self.buf[0:3] == b"BZh" and self.buf[4:10] == b"1AY&SY":
return "bz2"
return "tar"

View File

@ -529,6 +529,23 @@ class DetectReadTest(unittest.TestCase):
def test_detect_fileobj(self):
self._test_modes(self._testfunc_fileobj)
def test_detect_stream_bz2(self):
# Originally, tarfile's stream detection looked for the string
# "BZh91" at the start of the file. This is incorrect because
# the '9' represents the blocksize (900kB). If the file was
# compressed using another blocksize autodetection fails.
if not bz2:
return
with open(tarname, "rb") as fobj:
data = fobj.read()
# Compress with blocksize 100kB, the file starts with "BZh11".
with bz2.BZ2File(tmpname, "wb", compresslevel=1) as fobj:
fobj.write(data)
self._testfunc_file(tmpname, "r|*")
class MemberReadTest(ReadTest):
@ -1818,11 +1835,8 @@ def test_main():
if bz2:
# Create testtar.tar.bz2 and add bz2-specific tests.
support.unlink(bz2name)
tar = bz2.BZ2File(bz2name, "wb")
try:
with bz2.BZ2File(bz2name, "wb") as tar:
tar.write(data)
finally:
tar.close()
tests += [
Bz2MiscReadTest,

View File

@ -406,6 +406,9 @@ Core and Builtins
Library
-------
- tarfile.py: Correctly detect bzip2 compressed streams with blocksizes
other than 900k.
- Issue #13439: Fix many errors in turtle docstrings.
- Issue #6715: Add a module 'lzma' for compression using the LZMA algorithm.