From b3bd624a55ea5bf3a0e77cfa9d987d82ed23652f Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sun, 12 May 2013 11:57:26 +0200 Subject: Back out patch for #1159051, which caused backwards compatibility problems. --- Lib/gzip.py | 81 ++++++++++++++++++++++++++++----------------------- Lib/test/test_bz2.py | 14 --------- Lib/test/test_gzip.py | 14 --------- Lib/test/test_lzma.py | 14 --------- Misc/NEWS | 3 -- 5 files changed, 44 insertions(+), 82 deletions(-) mode change 100644 => 100755 Lib/test/test_gzip.py diff --git a/Lib/gzip.py b/Lib/gzip.py index a1f13b4..67fe1d4 100644 --- a/Lib/gzip.py +++ b/Lib/gzip.py @@ -65,6 +65,9 @@ def write32u(output, value): # or unsigned. output.write(struct.pack(" self.extrasize: - if not self._read(readsize): - if size > self.extrasize: - size = self.extrasize - break - readsize = min(self.max_read_chunk, readsize * 2) + try: + while size > self.extrasize: + self._read(readsize) + readsize = min(self.max_read_chunk, readsize * 2) + except EOFError: + if size > self.extrasize: + size = self.extrasize offset = self.offset - self.extrastart chunk = self.extrabuf[offset: offset + size] @@ -384,9 +386,12 @@ class GzipFile(io.BufferedIOBase): if self.extrasize <= 0 and self.fileobj is None: return b'' - # For certain input data, a single call to _read() may not return - # any data. In this case, retry until we get some data or reach EOF. - while self.extrasize <= 0 and self._read(): + try: + # For certain input data, a single call to _read() may not return + # any data. In this case, retry until we get some data or reach EOF. + while self.extrasize <= 0: + self._read() + except EOFError: pass if size < 0 or size > self.extrasize: size = self.extrasize @@ -409,9 +414,12 @@ class GzipFile(io.BufferedIOBase): if self.extrasize == 0: if self.fileobj is None: return b'' - # Ensure that we don't return b"" if we haven't reached EOF. - # 1024 is the same buffering heuristic used in read() - while self.extrasize == 0 and self._read(max(n, 1024)): + try: + # Ensure that we don't return b"" if we haven't reached EOF. + while self.extrasize == 0: + # 1024 is the same buffering heuristic used in read() + self._read(max(n, 1024)) + except EOFError: pass offset = self.offset - self.extrastart remaining = self.extrasize @@ -424,14 +432,13 @@ class GzipFile(io.BufferedIOBase): def _read(self, size=1024): if self.fileobj is None: - return False + raise EOFError("Reached EOF") if self._new_member: # If the _new_member flag is set, we have to # jump to the next member, if there is one. self._init_read() - if not self._read_gzip_header(): - return False + self._read_gzip_header() self.decompress = zlib.decompressobj(-zlib.MAX_WBITS) self._new_member = False @@ -448,7 +455,7 @@ class GzipFile(io.BufferedIOBase): self.fileobj.prepend(self.decompress.unused_data, True) self._read_eof() self._add_read_data( uncompress ) - return False + raise EOFError('Reached EOF') uncompress = self.decompress.decompress(buf) self._add_read_data( uncompress ) @@ -464,7 +471,6 @@ class GzipFile(io.BufferedIOBase): # a new member on the next call self._read_eof() self._new_member = True - return True def _add_read_data(self, data): self.crc = zlib.crc32(data, self.crc) & 0xffffffff @@ -479,7 +485,8 @@ class GzipFile(io.BufferedIOBase): # We check the that the computed CRC and size of the # uncompressed data matches the stored values. Note that the size # stored is the true file size mod 2**32. - crc32, isize = struct.unpack("