Bug report
If a tar file appears to be a tar.gz file, it can fail in this block of tarfile.py
while c < size:
# Skip underlying buffer to avoid unaligned double buffering.
if self.buf:
buf = self.buf
self.buf = b""
else:
buf = self.fileobj.read(self.bufsize)
if not buf:
break
try:
buf = self.cmp.decompress(buf)
except self.exception as e:
raise ReadError("invalid compressed data") from e
t.append(buf)
c += len(buf)
at:
buf = self.cmp.decompress(buf)
before self.exception is set.
Because around:
if comptype == "gz":
try:
import zlib
except ImportError:
raise CompressionError("zlib module is not available") from None
self.zlib = zlib
self.crc = zlib.crc32(b"")
if mode == "r":
self._init_read_gz()
self.exception = zlib.error
else:
self._init_write_gz()
This: self._init_read_gz()
is called before self.exception = zlib.error
Stack trace:
_read, tarfile.py:548
read, tarfile.py:526
_init_read_gz, tarfile.py:491
__init__, tarfile.py:375
open, tarfile.py:1827
<module>, test.py:2
In my case, buf = self.cmp.decompress(buf) failed to execute but that's a separate issue that may or may not be a bug
Your environment
- CPython versions tested on: 3.11.4
- Operating system and architecture: Windows 10 21H2
Linked PRs
Bug report
If a tar file appears to be a
tar.gzfile, it can fail in this block oftarfile.pyat:
before
self.exceptionis set.Because around:
This:
self._init_read_gz()is called before
self.exception = zlib.errorStack trace:
In my case,
buf = self.cmp.decompress(buf)failed to execute but that's a separate issue that may or may not be a bugYour environment
Linked PRs