Skip to content
2 changes: 1 addition & 1 deletion Lib/tarfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -498,7 +498,7 @@ def _init_read_gz(self):

if flag & 4:
xlen = ord(self.__read(1)) + 256 * ord(self.__read(1))
self.read(xlen)
self.__read(xlen)
if flag & 8:
while True:
s = self.__read(1)
Expand Down
33 changes: 31 additions & 2 deletions Lib/test/test_tarfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -893,10 +893,39 @@ def test_extractall_hardlink_on_symlink(self):
self._assert_on_file_content(hardlink_filepath, sha256_regtype)


class GzipReadTestBase:

def test_read_with_extra_field(self):
with open(self.tarname, 'rb') as f:
data = bytearray(f.read())
flags = data[3]
self.assertEqual(flags, 8)
data[3] = flags | 4
data[10:10] = b'\x05\x00extra'
with open(tmpname, 'wb') as f:
f.write(data)
print(self.mode)
with tarfile.open(tmpname, mode=self.mode):
pass

def test_read_with_file_comment(self):
with open(self.tarname, 'rb') as f:
data = bytearray(f.read())
flags = data[3]
self.assertEqual(flags, 8)
data[3] = flags | 16
i = data.index(0, 10) + 1
data[i:i] = b'comment\x00'
with open(tmpname, 'wb') as f:
f.write(data)
with tarfile.open(tmpname, mode=self.mode):
pass


class MiscReadTest(MiscReadTestBase, unittest.TestCase):
test_fail_comp = None

class GzipMiscReadTest(GzipTest, MiscReadTestBase, unittest.TestCase):
class GzipMiscReadTest(GzipTest, GzipReadTestBase, MiscReadTestBase, unittest.TestCase):
pass

class Bz2MiscReadTest(Bz2Test, MiscReadTestBase, unittest.TestCase):
Expand Down Expand Up @@ -970,7 +999,7 @@ def test_compare_members(self):
finally:
tar1.close()

class GzipStreamReadTest(GzipTest, StreamReadTest):
class GzipStreamReadTest(GzipTest, GzipReadTestBase, StreamReadTest):
pass

class Bz2StreamReadTest(Bz2Test, StreamReadTest):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix :mod:`tarfile` stream mode exception when process the file with the gzip extra field.
Loading