From 5775aa8e295102156de14fd1ba284722c6ede95a Mon Sep 17 00:00:00 2001 From: ankhikarmakar <100954262+ankhikarmakar@users.noreply.github.com> Date: Mon, 18 May 2026 12:31:15 -0700 Subject: [PATCH] gh-149980: Strip all trailing slashes from GNU long directory names in tarfile (GH-150019) --- Lib/tarfile.py | 2 +- Lib/test/test_tarfile.py | 21 +++++++++++++++++++ ...-05-19-12-00-00.gh-issue-149980.Kx7p2A.rst | 3 +++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2026-05-19-12-00-00.gh-issue-149980.Kx7p2A.rst diff --git a/Lib/tarfile.py b/Lib/tarfile.py index 772b51295fcf..87500c726ce9 100644 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -1425,7 +1425,7 @@ class TarInfo(object): # Remove redundant slashes from directories. This is to be consistent # with frombuf(). if next.isdir(): - next.name = next.name.removesuffix("/") + next.name = next.name.rstrip("/") return next diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 8e213a8f9992..02fd9620bcf3 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -1313,6 +1313,27 @@ class GNUReadTest(LongnameTest, ReadTest, unittest.TestCase): else: return False + def test_gnulong_dirname_strips_all_trailing_slashes(self): + # gh-149980: _proc_gnulong must normalize trailing slashes the same + # way _frombuf and _proc_builtin do (rstrip, not removesuffix), so + # a GNU long-name directory entry agrees with a short-name one. + long_name = "a" * 120 + "///" # > 100 bytes => GNUTYPE_LONGNAME + short_name = "b" * 20 + "///" + + buf = io.BytesIO() + with tarfile.open(fileobj=buf, mode="w", + format=tarfile.GNU_FORMAT) as tar: + for name in (short_name, long_name): + info = tarfile.TarInfo(name=name) + info.type = tarfile.DIRTYPE + tar.addfile(info) + + buf.seek(0) + with tarfile.open(fileobj=buf, mode="r") as tar: + names = [m.name for m in tar.getmembers()] + + self.assertEqual(names, ["b" * 20, "a" * 120]) + class PaxReadTest(LongnameTest, ReadTest, unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2026-05-19-12-00-00.gh-issue-149980.Kx7p2A.rst b/Misc/NEWS.d/next/Library/2026-05-19-12-00-00.gh-issue-149980.Kx7p2A.rst new file mode 100644 index 000000000000..b056f6a3cda2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-05-19-12-00-00.gh-issue-149980.Kx7p2A.rst @@ -0,0 +1,3 @@ +Fix :mod:`tarfile` so that GNU long-name directory entries have all +trailing slashes stripped from their names, matching the behavior for +short-name entries. Previously, only a single trailing slash was removed. -- 2.47.3