Patch #1610437: fix a tarfile bug with long filename headers.
(backport from rev. 52938)
This commit is contained in:
parent
19d12d4cea
commit
25f58f6b5a
|
@ -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
|
||||
|
|
|
@ -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")
|
||||
|
||||
|
|
Loading…
Reference in New Issue