From 08303dbd722f379e17682daaaf60ad515e1800fb Mon Sep 17 00:00:00 2001 From: =?utf8?q?Lars=20Gust=C3=A4bel?= Date: Mon, 11 Feb 2008 18:36:07 +0000 Subject: [PATCH] Backport the nts() function from the trunk. This fixes problems with the xstar format that puts extra fields inside the space that POSIX has reserved for the prefix field. --- Lib/tarfile.py | 25 +++++++++++++++++-------- Lib/test/test_tarfile.py | 8 +++++++- Lib/test/testtar.tar | Bin 133120 -> 143360 bytes Misc/NEWS | 2 ++ 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/Lib/tarfile.py b/Lib/tarfile.py index 94fdcb027684..5ad096dbf36b 100644 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -139,13 +139,22 @@ def stn(s, length): """ return s[:length] + (length - len(s)) * NUL +def nts(s): + """Convert a null-terminated string field to a python string. + """ + # Use the string up to the first null char. + p = s.find("\0") + if p == -1: + return s + return s[:p] + def nti(s): """Convert a number field to a python number. """ # There are two possible encodings for a number field, see # itn() below. if s[0] != chr(0200): - n = int(s.rstrip(NUL + " ") or "0", 8) + n = int(nts(s) or "0", 8) else: n = 0L for i in xrange(len(s) - 1): @@ -872,7 +881,7 @@ class TarInfo(object): tarinfo = cls() tarinfo.buf = buf - tarinfo.name = buf[0:100].rstrip(NUL) + tarinfo.name = nts(buf[0:100]) tarinfo.mode = nti(buf[100:108]) tarinfo.uid = nti(buf[108:116]) tarinfo.gid = nti(buf[116:124]) @@ -880,12 +889,12 @@ class TarInfo(object): tarinfo.mtime = nti(buf[136:148]) tarinfo.chksum = nti(buf[148:156]) tarinfo.type = buf[156:157] - tarinfo.linkname = buf[157:257].rstrip(NUL) - tarinfo.uname = buf[265:297].rstrip(NUL) - tarinfo.gname = buf[297:329].rstrip(NUL) + tarinfo.linkname = nts(buf[157:257]) + tarinfo.uname = nts(buf[265:297]) + tarinfo.gname = nts(buf[297:329]) tarinfo.devmajor = nti(buf[329:337]) tarinfo.devminor = nti(buf[337:345]) - prefix = buf[345:500].rstrip(NUL) + prefix = nts(buf[345:500]) if prefix and not tarinfo.issparse(): tarinfo.name = prefix + "/" + tarinfo.name @@ -1892,9 +1901,9 @@ class TarFile(object): # the longname information. next.offset = tarinfo.offset if tarinfo.type == GNUTYPE_LONGNAME: - next.name = buf.rstrip(NUL) + next.name = nts(buf) elif tarinfo.type == GNUTYPE_LONGLINK: - next.linkname = buf.rstrip(NUL) + next.linkname = nts(buf) return next diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index dc2803895d70..a9797aeb992c 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -26,7 +26,7 @@ def path(path): testtar = path("testtar.tar") tempdir = os.path.join(tempfile.gettempdir(), "testtar" + os.extsep + "dir") tempname = test_support.TESTFN -membercount = 12 +membercount = 13 def tarname(comp=""): if not comp: @@ -225,6 +225,12 @@ class ReadTest(BaseTest): self.assertEqual(tarinfo.mtime, os.path.getmtime(path)) tar.close() + def test_star(self): + try: + self.tar.getmember("7-STAR") + except KeyError: + self.fail("finding 7-STAR member failed (mangled prefix?)") + class ReadStreamTest(ReadTest): sep = "|" diff --git a/Lib/test/testtar.tar b/Lib/test/testtar.tar index 1f4493f3516ca1003553c591f94027068d8a6761..6c3efa9b01a43722151d9341c06c22e0b9b2cd46 100644 GIT binary patch delta 7246 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 CJ{A%H delta 14 Vc-m`tz|k;)qhSf-hh+(j5&$nc1+@SG diff --git a/Misc/NEWS b/Misc/NEWS index e9473dd749a4..0cd740746539 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -83,6 +83,8 @@ Core and builtins Library ------- +- tarfile.py: Fix reading of xstar archives. + - #2021: Allow tempfile.NamedTemporaryFile to be used in with statements by correctly supporting the context management protocol. -- 2.47.3