Skip to content

Commit 283b34e

Browse files
gdh1995gongdahan
authored and
gongdahan
committed
Update _create_gnu_long_header to align with GNU Tar
1 parent bbf1979 commit 283b34e

File tree

4 files changed

+35
-0
lines changed

4 files changed

+35
-0
lines changed

Lib/tarfile.py

+3
Original file line numberDiff line numberDiff line change
@@ -1190,6 +1190,9 @@ def _create_gnu_long_header(cls, name, type, encoding, errors):
11901190
info["type"] = type
11911191
info["size"] = len(name)
11921192
info["magic"] = GNU_MAGIC
1193+
info["mode"] = 0o100644
1194+
info["uname"] = "root"
1195+
info["gname"] = "root"
11931196

11941197
# create extended header + name blocks.
11951198
return cls._create_header(info, USTAR_FORMAT, encoding, errors) + \

Lib/test/test_tarfile.py

+28
Original file line numberDiff line numberDiff line change
@@ -1875,6 +1875,34 @@ def test_longnamelink_1025(self):
18751875
self._test(("longnam/" * 127) + "longname_",
18761876
("longlnk/" * 127) + "longlink_")
18771877

1878+
def test_hidden_header_for_longname(self):
1879+
# Regression test for gh-130819.
1880+
memory_file = io.BytesIO()
1881+
tar = tarfile.open(mode="w", fileobj=memory_file, format=tarfile.GNU_FORMAT)
1882+
tar_info = tarfile.TarInfo("abcdef" * 20)
1883+
tar_info.type = tarfile.DIRTYPE
1884+
tar.addfile(tar_info, None)
1885+
tar.close()
1886+
1887+
class RawTabInfo(tarfile.TarInfo):
1888+
1889+
def _proc_member(self, tar_file):
1890+
if self.type in (tarfile.GNUTYPE_LONGNAME, tarfile.GNUTYPE_LONGLINK):
1891+
tester.assertEqual(self.mode, 0o644)
1892+
tester.assertEqual(self.uname, "root")
1893+
tester.assertEqual(self.gname, "root")
1894+
return super()._proc_member(tar_file) # type: ignore
1895+
1896+
tester = self
1897+
memory_file.seek(0)
1898+
tar = tarfile.open(fileobj=memory_file, mode="r", tarinfo=RawTabInfo)
1899+
try:
1900+
members = tar.getmembers()
1901+
self.assertEqual(len(members), 1)
1902+
finally:
1903+
tar.close()
1904+
memory_file.close()
1905+
18781906

18791907
class DeviceHeaderTest(WriteTestBase, unittest.TestCase):
18801908

Misc/ACKS

+1
Original file line numberDiff line numberDiff line change
@@ -663,6 +663,7 @@ Mikhail Golubev
663663
Marta Gómez Macías
664664
Guilherme Gonçalves
665665
Tiago Gonçalves
666+
Dahan Gong
666667
Chris Gonnerman
667668
Shelley Gooch
668669
David Goodger
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Emit ``mode``, ``uname`` and ``gname`` fields for long paths in
2+
:mod:`tarfile` archives, providing better bit-for-bit compatibility with GNU
3+
``tar(1)``.

0 commit comments

Comments
 (0)