Patch #1610437: fix a tarfile bug with long filename headers.

This commit is contained in:
Georg Brandl 2006-12-06 22:21:18 +00:00
parent 0a286d0b53
commit 87fa559479
3 changed files with 21 additions and 11 deletions

View File

@ -857,7 +857,11 @@ class TarInfo(object):
if self.name.endswith("/"):
type = DIRTYPE
name = normpath(self.name)
if type in (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK):
# Prevent "././@LongLink" from being normalized.
name = self.name
else:
name = normpath(self.name)
if type == DIRTYPE:
# directories should end with '/'
@ -913,7 +917,7 @@ class TarInfo(object):
]
buf += struct.pack("%ds" % BLOCKSIZE, "".join(parts))
chksum = calc_chksums(buf)[0]
chksum = calc_chksums(buf[-BLOCKSIZE:])[0]
buf = buf[:-364] + "%06o\0" % chksum + buf[-357:]
self.buf = buf
return buf

View File

@ -388,13 +388,6 @@ class WriteGNULongTest(unittest.TestCase):
is tested as well.
"""
def setUp(self):
self.tar = tarfile.open(tmpname(), "w")
self.tar.posix = False
def tearDown(self):
self.tar.close()
def _length(self, s):
blocks, remainder = divmod(len(s) + 1, 512)
if remainder:
@ -423,12 +416,23 @@ class WriteGNULongTest(unittest.TestCase):
tarinfo.linkname = link
tarinfo.type = tarfile.LNKTYPE
self.tar.addfile(tarinfo)
tar = tarfile.open(tmpname(), "w")
tar.posix = False
tar.addfile(tarinfo)
v1 = self._calc_size(name, link)
v2 = self.tar.offset
v2 = tar.offset
self.assertEqual(v1, v2, "GNU longname/longlink creation failed")
tar.close()
tar = tarfile.open(tmpname())
member = tar.next()
self.failIf(member is None, "unable to read longname member")
self.assert_(tarinfo.name == member.name and \
tarinfo.linkname == member.linkname, \
"unable to read longname member")
def test_longname_1023(self):
self._test(("longnam/" * 127) + "longnam")

View File

@ -101,6 +101,8 @@ Core and builtins
Library
-------
- Patch #1610437: fix a tarfile bug with long filename headers.
- Patch #1371075: Make ConfigParser accept optional dict type
for ordering, sorting, etc.