Commit 1eea58f8 authored by Georg Brandl's avatar Georg Brandl

Patch [ 1583506 ] tarfile.py: 100-char filenames are truncated

 (backport from rev. 52431)
parent 79b89f72
...@@ -136,7 +136,7 @@ TOEXEC = 0001 # execute/search by other ...@@ -136,7 +136,7 @@ TOEXEC = 0001 # execute/search by other
def stn(s, length): def stn(s, length):
"""Convert a python string to a null-terminated string buffer. """Convert a python string to a null-terminated string buffer.
""" """
return s[:length-1] + (length - len(s) - 1) * NUL + NUL return s[:length] + (length - len(s)) * NUL
def nti(s): def nti(s):
"""Convert a number field to a python number. """Convert a number field to a python number.
......
...@@ -280,6 +280,32 @@ class WriteTest(BaseTest): ...@@ -280,6 +280,32 @@ class WriteTest(BaseTest):
else: else:
self.dst.addfile(tarinfo, f) self.dst.addfile(tarinfo, f)
class Write100Test(BaseTest):
# The name field in a tar header stores strings of at most 100 chars.
# If a string is shorter than 100 chars it has to be padded with '\0',
# which implies that a string of exactly 100 chars is stored without
# a trailing '\0'.
def setUp(self):
self.name = "01234567890123456789012345678901234567890123456789"
self.name += "01234567890123456789012345678901234567890123456789"
self.tar = tarfile.open(tmpname(), "w")
t = tarfile.TarInfo(self.name)
self.tar.addfile(t)
self.tar.close()
self.tar = tarfile.open(tmpname())
def tearDown(self):
self.tar.close()
def test(self):
self.assertEqual(self.tar.getnames()[0], self.name,
"failed to store 100 char filename")
class WriteSize0Test(BaseTest): class WriteSize0Test(BaseTest):
mode = 'w' mode = 'w'
...@@ -623,6 +649,7 @@ def test_main(): ...@@ -623,6 +649,7 @@ def test_main():
ReadAsteriskTest, ReadAsteriskTest,
ReadStreamAsteriskTest, ReadStreamAsteriskTest,
WriteTest, WriteTest,
Write100Test,
WriteSize0Test, WriteSize0Test,
WriteStreamTest, WriteStreamTest,
WriteGNULongTest, WriteGNULongTest,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment