From 08303dbd722f379e17682daaaf60ad515e1800fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?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 94fdcb02768..5ad096dbf36 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 dc2803895d7..a9797aeb992 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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