diff --git a/Doc/whatsnew/3.15.rst b/Doc/whatsnew/3.15.rst index bad9e2d8dff37f..ae75d14a3088ba 100644 --- a/Doc/whatsnew/3.15.rst +++ b/Doc/whatsnew/3.15.rst @@ -1541,6 +1541,9 @@ tarfile now replace slashes with backslashes in symlink targets on Windows to prevent creation of corrupted links. (Contributed by Christoph Walcher in :gh:`57911`.) +* :func:`~tarfile.TarFile.gettarinfo` now replaces backslashes with slashes in + symlink targets on Windows to conform to the tar format standard. (Contributed + by Daniele Nicolodi in :gh:`151669`.) threading diff --git a/Lib/tarfile.py b/Lib/tarfile.py index 8c058357f114ad..fe28ea68cfd132 100644 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -2275,7 +2275,7 @@ def gettarinfo(self, name=None, arcname=None, fileobj=None): type = FIFOTYPE elif stat.S_ISLNK(stmd): type = SYMTYPE - linkname = os.readlink(name) + linkname = os.readlink(name).replace(os.sep, "/") elif stat.S_ISCHR(stmd): type = CHRTYPE elif stat.S_ISBLK(stmd): diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 9615547fc22dfa..2c6f0da7887f53 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -1647,6 +1647,22 @@ def test_symlink_size(self): finally: os_helper.unlink(path) + @os_helper.skip_unless_symlink + def test_symlink_target_normalization(self): + # Test for gh-151669. + path = os.path.join(TEMPDIR, "symlink") + target = "subdir/link/target" + os.symlink(target.replace("/", os.sep), path) + try: + tar = tarfile.open(tmpname, self.mode) + try: + tarinfo = tar.gettarinfo(path) + self.assertEqual(tarinfo.linkname, target) + finally: + tar.close() + finally: + os_helper.unlink(path) + def test_add_self(self): # Test for #1257255. dstname = os.path.abspath(tmpname) diff --git a/Misc/NEWS.d/next/Library/2026-06-24-23-28-42.gh-issue-151669.tPUavQ.rst b/Misc/NEWS.d/next/Library/2026-06-24-23-28-42.gh-issue-151669.tPUavQ.rst new file mode 100644 index 00000000000000..d8e4850ba94e14 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-06-24-23-28-42.gh-issue-151669.tPUavQ.rst @@ -0,0 +1,3 @@ +On Windows, when populating tar archives from filesystem content, to +conform to the tar format standard, backslashes in symlink targets are +be replaced by slashes.