diff options
author | Lars Gustäbel <lars@gustaebel.de> | 2015-05-27 10:53:44 (GMT) |
---|---|---|
committer | Lars Gustäbel <lars@gustaebel.de> | 2015-05-27 10:53:44 (GMT) |
commit | 20703c696913dc8ec7d9b7153a10eda3cecce164 (patch) | |
tree | 8c52eeed160bf625816d617b60da69d8c4a51044 /Lib | |
parent | c30a6ce59d03cc506b1a6164c838d18f6526a004 (diff) | |
download | cpython-20703c696913dc8ec7d9b7153a10eda3cecce164.zip cpython-20703c696913dc8ec7d9b7153a10eda3cecce164.tar.gz cpython-20703c696913dc8ec7d9b7153a10eda3cecce164.tar.bz2 |
tarfile.open() with mode 'x' created files without an end of archive marker.
Diffstat (limited to 'Lib')
-rwxr-xr-x | Lib/tarfile.py | 4 | ||||
-rw-r--r-- | Lib/test/test_tarfile.py | 15 |
2 files changed, 16 insertions, 3 deletions
diff --git a/Lib/tarfile.py b/Lib/tarfile.py index 0f1c825..bf2234f 100755 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -1484,7 +1484,7 @@ class TarFile(object): except HeaderError as e: raise ReadError(str(e)) - if self.mode in "aw": + if self.mode in ("a", "w", "x"): self._loaded = True if self.pax_headers: @@ -1716,7 +1716,7 @@ class TarFile(object): self.closed = True try: - if self.mode in "aw": + if self.mode in ("a", "w", "x"): self.fileobj.write(NUL * (BLOCKSIZE * 2)) self.offset += (BLOCKSIZE * 2) # fill up the end with zero-blocks diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 45c30ab..66a0a61 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -982,6 +982,19 @@ class WriteTestBase(TarTest): self.assertFalse(fobj.closed) 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): @@ -1431,7 +1444,7 @@ class GNUWriteTest(unittest.TestCase): ("longlnk/" * 127) + "longlink_") -class CreateTest(TarTest, unittest.TestCase): +class CreateTest(WriteTestBase, unittest.TestCase): prefix = "x:" |