tarfile.open() with mode 'x' created files without an end of archive marker.
This commit is contained in:
parent
c30a6ce59d
commit
20703c6969
|
@ -1484,7 +1484,7 @@ class TarFile(object):
|
||||||
except HeaderError as e:
|
except HeaderError as e:
|
||||||
raise ReadError(str(e))
|
raise ReadError(str(e))
|
||||||
|
|
||||||
if self.mode in "aw":
|
if self.mode in ("a", "w", "x"):
|
||||||
self._loaded = True
|
self._loaded = True
|
||||||
|
|
||||||
if self.pax_headers:
|
if self.pax_headers:
|
||||||
|
@ -1716,7 +1716,7 @@ class TarFile(object):
|
||||||
|
|
||||||
self.closed = True
|
self.closed = True
|
||||||
try:
|
try:
|
||||||
if self.mode in "aw":
|
if self.mode in ("a", "w", "x"):
|
||||||
self.fileobj.write(NUL * (BLOCKSIZE * 2))
|
self.fileobj.write(NUL * (BLOCKSIZE * 2))
|
||||||
self.offset += (BLOCKSIZE * 2)
|
self.offset += (BLOCKSIZE * 2)
|
||||||
# fill up the end with zero-blocks
|
# fill up the end with zero-blocks
|
||||||
|
|
|
@ -982,6 +982,19 @@ class WriteTestBase(TarTest):
|
||||||
self.assertFalse(fobj.closed)
|
self.assertFalse(fobj.closed)
|
||||||
self.assertEqual(data, fobj.getvalue())
|
self.assertEqual(data, fobj.getvalue())
|
||||||
|
|
||||||
|
def test_eof_marker(self):
|
||||||
|
# Make sure an end of archive marker is written (two zero blocks).
|
||||||
|
# tarfile insists on aligning archives to a 20 * 512 byte recordsize.
|
||||||
|
# So, we create an archive that has exactly 10240 bytes without the
|
||||||
|
# marker, and has 20480 bytes once the marker is written.
|
||||||
|
with tarfile.open(tmpname, self.mode) as tar:
|
||||||
|
t = tarfile.TarInfo("foo")
|
||||||
|
t.size = tarfile.RECORDSIZE - tarfile.BLOCKSIZE
|
||||||
|
tar.addfile(t, io.BytesIO(b"a" * t.size))
|
||||||
|
|
||||||
|
with self.open(tmpname, "rb") as fobj:
|
||||||
|
self.assertEqual(len(fobj.read()), tarfile.RECORDSIZE * 2)
|
||||||
|
|
||||||
|
|
||||||
class WriteTest(WriteTestBase, unittest.TestCase):
|
class WriteTest(WriteTestBase, unittest.TestCase):
|
||||||
|
|
||||||
|
@ -1431,7 +1444,7 @@ class GNUWriteTest(unittest.TestCase):
|
||||||
("longlnk/" * 127) + "longlink_")
|
("longlnk/" * 127) + "longlink_")
|
||||||
|
|
||||||
|
|
||||||
class CreateTest(TarTest, unittest.TestCase):
|
class CreateTest(WriteTestBase, unittest.TestCase):
|
||||||
|
|
||||||
prefix = "x:"
|
prefix = "x:"
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue