mirror of
https://github.com/python/cpython.git
synced 2025-10-09 16:34:44 +00:00
Patch #1610437: fix a tarfile bug with long filename headers.
(backport from rev. 52938)
This commit is contained in:
parent
19d12d4cea
commit
25f58f6b5a
3 changed files with 21 additions and 11 deletions
|
@ -857,7 +857,11 @@ class TarInfo(object):
|
||||||
if self.name.endswith("/"):
|
if self.name.endswith("/"):
|
||||||
type = DIRTYPE
|
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:
|
if type == DIRTYPE:
|
||||||
# directories should end with '/'
|
# directories should end with '/'
|
||||||
|
@ -913,7 +917,7 @@ class TarInfo(object):
|
||||||
]
|
]
|
||||||
|
|
||||||
buf += struct.pack("%ds" % BLOCKSIZE, "".join(parts))
|
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:]
|
buf = buf[:-364] + "%06o\0" % chksum + buf[-357:]
|
||||||
self.buf = buf
|
self.buf = buf
|
||||||
return buf
|
return buf
|
||||||
|
|
|
@ -388,13 +388,6 @@ class WriteGNULongTest(unittest.TestCase):
|
||||||
is tested as well.
|
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):
|
def _length(self, s):
|
||||||
blocks, remainder = divmod(len(s) + 1, 512)
|
blocks, remainder = divmod(len(s) + 1, 512)
|
||||||
if remainder:
|
if remainder:
|
||||||
|
@ -423,12 +416,23 @@ class WriteGNULongTest(unittest.TestCase):
|
||||||
tarinfo.linkname = link
|
tarinfo.linkname = link
|
||||||
tarinfo.type = tarfile.LNKTYPE
|
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)
|
v1 = self._calc_size(name, link)
|
||||||
v2 = self.tar.offset
|
v2 = tar.offset
|
||||||
self.assertEqual(v1, v2, "GNU longname/longlink creation failed")
|
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):
|
def test_longname_1023(self):
|
||||||
self._test(("longnam/" * 127) + "longnam")
|
self._test(("longnam/" * 127) + "longnam")
|
||||||
|
|
||||||
|
|
|
@ -110,6 +110,8 @@ Extension Modules
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Patch #1610437: fix a tarfile bug with long filename headers.
|
||||||
|
|
||||||
- Patch #1472877: Fix Tix subwidget name resolution.
|
- Patch #1472877: Fix Tix subwidget name resolution.
|
||||||
|
|
||||||
- Patch #1594554: Always close a tkSimpleDialog on ok(), even
|
- Patch #1594554: Always close a tkSimpleDialog on ok(), even
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue