summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xLib/tarfile.py10
-rw-r--r--Lib/test/test_tarfile.py17
-rw-r--r--Misc/NEWS.d/next/Library/2022-04-08-22-12-11.bpo-47231.lvyglt.rst1
3 files changed, 28 insertions, 0 deletions
diff --git a/Lib/tarfile.py b/Lib/tarfile.py
index 8d43d0d..169c88d 100755
--- a/Lib/tarfile.py
+++ b/Lib/tarfile.py
@@ -1163,6 +1163,11 @@ class TarInfo(object):
# header information.
self._apply_pax_info(tarfile.pax_headers, tarfile.encoding, tarfile.errors)
+ # Remove redundant slashes from directories. This is to be consistent
+ # with frombuf().
+ if self.isdir():
+ self.name = self.name.rstrip("/")
+
return self
def _proc_gnulong(self, tarfile):
@@ -1185,6 +1190,11 @@ class TarInfo(object):
elif self.type == GNUTYPE_LONGLINK:
next.linkname = nts(buf, tarfile.encoding, tarfile.errors)
+ # Remove redundant slashes from directories. This is to be consistent
+ # with frombuf().
+ if next.isdir():
+ next.name = next.name.removesuffix("/")
+
return next
def _proc_sparse(self, tarfile):
diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py
index 5c08468..f1aed5c 100644
--- a/Lib/test/test_tarfile.py
+++ b/Lib/test/test_tarfile.py
@@ -228,6 +228,7 @@ class UstarReadTest(ReadTest, unittest.TestCase):
def add_dir_and_getmember(self, name):
with os_helper.temp_cwd():
with tarfile.open(tmpname, 'w') as tar:
+ tar.format = tarfile.USTAR_FORMAT
try:
os.mkdir(name)
tar.add(name)
@@ -1020,11 +1021,26 @@ class LongnameTest:
"iso8859-1", "strict")
self.assertEqual(tarinfo.type, self.longnametype)
+ def test_longname_directory(self):
+ # Test reading a longlink directory. Issue #47231.
+ longdir = ('a' * 101) + '/'
+ with os_helper.temp_cwd():
+ with tarfile.open(tmpname, 'w') as tar:
+ tar.format = self.format
+ try:
+ os.mkdir(longdir)
+ tar.add(longdir)
+ finally:
+ os.rmdir(longdir)
+ with tarfile.open(tmpname) as tar:
+ self.assertIsNotNone(tar.getmember(longdir))
+ self.assertIsNotNone(tar.getmember(longdir.removesuffix('/')))
class GNUReadTest(LongnameTest, ReadTest, unittest.TestCase):
subdir = "gnu"
longnametype = tarfile.GNUTYPE_LONGNAME
+ format = tarfile.GNU_FORMAT
# Since 3.2 tarfile is supposed to accurately restore sparse members and
# produce files with holes. This is what we actually want to test here.
@@ -1084,6 +1100,7 @@ class PaxReadTest(LongnameTest, ReadTest, unittest.TestCase):
subdir = "pax"
longnametype = tarfile.XHDTYPE
+ format = tarfile.PAX_FORMAT
def test_pax_global_headers(self):
tar = tarfile.open(tarname, encoding="iso8859-1")
diff --git a/Misc/NEWS.d/next/Library/2022-04-08-22-12-11.bpo-47231.lvyglt.rst b/Misc/NEWS.d/next/Library/2022-04-08-22-12-11.bpo-47231.lvyglt.rst
new file mode 100644
index 0000000..ee05c5e
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-04-08-22-12-11.bpo-47231.lvyglt.rst
@@ -0,0 +1 @@
+Fixed an issue with inconsistent trailing slashes in tarfile longname directories.