mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
SF #846659, fix bufsize violation and GNU longname/longlink extensions
This commit is contained in:
parent
13e50fe453
commit
0662f8a5ea
3 changed files with 96 additions and 2 deletions
|
@ -205,6 +205,94 @@ class WriteTest(BaseTest):
|
|||
class WriteStreamTest(WriteTest):
|
||||
sep = '|'
|
||||
|
||||
class WriteGNULongTest(unittest.TestCase):
|
||||
"""This testcase checks for correct creation of GNU Longname
|
||||
and Longlink extensions.
|
||||
|
||||
It creates a tarfile and adds empty members with either
|
||||
long names, long linknames or both and compares the size
|
||||
of the tarfile with the expected size.
|
||||
|
||||
It checks for SF bug #812325 in TarFile._create_gnulong().
|
||||
|
||||
While I was writing this testcase, I noticed a second bug
|
||||
in the same method:
|
||||
Long{names,links} weren't null-terminated which lead to
|
||||
bad tarfiles when their length was a multiple of 512. This
|
||||
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:
|
||||
blocks += 1
|
||||
return blocks * 512
|
||||
|
||||
def _calc_size(self, name, link=None):
|
||||
# initial tar header
|
||||
count = 512
|
||||
|
||||
if len(name) > tarfile.LENGTH_NAME:
|
||||
# gnu longname extended header + longname
|
||||
count += 512
|
||||
count += self._length(name)
|
||||
|
||||
if link is not None and len(link) > tarfile.LENGTH_LINK:
|
||||
# gnu longlink extended header + longlink
|
||||
count += 512
|
||||
count += self._length(link)
|
||||
|
||||
return count
|
||||
|
||||
def _test(self, name, link=None):
|
||||
tarinfo = tarfile.TarInfo(name)
|
||||
if link:
|
||||
tarinfo.linkname = link
|
||||
tarinfo.type = tarfile.LNKTYPE
|
||||
|
||||
self.tar.addfile(tarinfo)
|
||||
|
||||
v1 = self._calc_size(name, link)
|
||||
v2 = self.tar.offset
|
||||
self.assertEqual(v1, v2, "GNU longname/longlink creation failed")
|
||||
|
||||
def test_longname_1023(self):
|
||||
self._test(("longnam/" * 127) + "longnam")
|
||||
|
||||
def test_longname_1024(self):
|
||||
self._test(("longnam/" * 127) + "longname")
|
||||
|
||||
def test_longname_1025(self):
|
||||
self._test(("longnam/" * 127) + "longname_")
|
||||
|
||||
def test_longlink_1023(self):
|
||||
self._test("name", ("longlnk/" * 127) + "longlnk")
|
||||
|
||||
def test_longlink_1024(self):
|
||||
self._test("name", ("longlnk/" * 127) + "longlink")
|
||||
|
||||
def test_longlink_1025(self):
|
||||
self._test("name", ("longlnk/" * 127) + "longlink_")
|
||||
|
||||
def test_longnamelink_1023(self):
|
||||
self._test(("longnam/" * 127) + "longnam",
|
||||
("longlnk/" * 127) + "longlnk")
|
||||
|
||||
def test_longnamelink_1024(self):
|
||||
self._test(("longnam/" * 127) + "longname",
|
||||
("longlnk/" * 127) + "longlink")
|
||||
|
||||
def test_longnamelink_1025(self):
|
||||
self._test(("longnam/" * 127) + "longname_",
|
||||
("longlnk/" * 127) + "longlink_")
|
||||
|
||||
# Gzip TestCases
|
||||
class ReadTestGzip(ReadTest):
|
||||
comp = "gz"
|
||||
|
@ -245,7 +333,8 @@ def test_main():
|
|||
ReadTest,
|
||||
ReadStreamTest,
|
||||
WriteTest,
|
||||
WriteStreamTest
|
||||
WriteStreamTest,
|
||||
WriteGNULongTest,
|
||||
]
|
||||
|
||||
if gzip:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue