--- /home/brett/zipfile.py 2016-01-07 07:08:28.631252291 -0500 +++ zipfile2.py 2016-01-07 08:28:05.527532315 -0500 @@ -927,9 +927,17 @@ data = self._decompressor.decompress(data) self._eof = self._decompressor.eof or self._compress_left <= 0 - data = data[:self._left] + # self._left is initialized from the zip info + # size of the file. If that does not match up + # with reality, we can get an error due to incomplete + # read. (Bad CRC-32) Don't exclude valid data + if self._left > n: + data = data[:self._left] self._left -= len(data) - if self._left <= 0: + + # Don't set EOF unless there is no more data to be consumed. + data_left = self._compress_left > 0 or self._decompressor.unconsumed_tail + if self._left <= 0 and not data_left: self._eof = True self._update_crc(data) return data @@ -943,6 +951,7 @@ data = self._fileobj.read(n) self._compress_left -= len(data) + if not data: raise EOFError