From bd94eb52d17f8fddd6e60d87b6bce5354a297cf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Sat, 27 Aug 2005 10:08:21 +0000 Subject: Patch #1168594: set sizes of non-regular files to zero. Fixes #1167128. --- Lib/tarfile.py | 26 ++++++++++++-------------- Lib/test/test_tarfile.py | 35 +++++++++++++++++++++++++++++++++++ Misc/NEWS | 2 ++ 3 files changed, 49 insertions(+), 14 deletions(-) diff --git a/Lib/tarfile.py b/Lib/tarfile.py index 366a244..ce4d02f 100644 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -1132,17 +1132,16 @@ class TarFile(object): # Fill the TarInfo object with all # information we can get. - tarinfo.name = arcname - tarinfo.mode = stmd - tarinfo.uid = statres.st_uid - tarinfo.gid = statres.st_gid - if stat.S_ISDIR(stmd): - # For a directory, the size must be 0 - tarinfo.size = 0 - else: + tarinfo.name = arcname + tarinfo.mode = stmd + tarinfo.uid = statres.st_uid + tarinfo.gid = statres.st_gid + if stat.S_ISREG(stmd): tarinfo.size = statres.st_size + else: + tarinfo.size = 0L tarinfo.mtime = statres.st_mtime - tarinfo.type = type + tarinfo.type = type tarinfo.linkname = linkname if pwd: try: @@ -1233,16 +1232,15 @@ class TarFile(object): self.addfile(tarinfo, f) f.close() - if tarinfo.type in (LNKTYPE, SYMTYPE, FIFOTYPE, CHRTYPE, BLKTYPE): - tarinfo.size = 0L - self.addfile(tarinfo) - - if tarinfo.isdir(): + elif tarinfo.isdir(): self.addfile(tarinfo) if recursive: for f in os.listdir(name): self.add(os.path.join(name, f), os.path.join(arcname, f)) + else: + self.addfile(tarinfo) + def addfile(self, tarinfo, fileobj=None): """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is given, tarinfo.size bytes are read from it and added to the archive. diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 0fae5ef..c0d9eca 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -208,6 +208,40 @@ class WriteTest(BaseTest): else: self.dst.addfile(tarinfo, f) +class WriteSize0Test(BaseTest): + mode = 'w' + + def setUp(self): + self.tmpdir = dirname() + self.dstname = tmpname() + self.dst = tarfile.open(self.dstname, "w") + + def tearDown(self): + self.dst.close() + + def test_file(self): + path = os.path.join(self.tmpdir, "file") + file(path, "w") + tarinfo = self.dst.gettarinfo(path) + self.assertEqual(tarinfo.size, 0) + file(path, "w").write("aaa") + tarinfo = self.dst.gettarinfo(path) + self.assertEqual(tarinfo.size, 3) + + def test_directory(self): + path = os.path.join(self.tmpdir, "directory") + os.mkdir(path) + tarinfo = self.dst.gettarinfo(path) + self.assertEqual(tarinfo.size, 0) + + def test_symlink(self): + if hasattr(os, "symlink"): + path = os.path.join(self.tmpdir, "symlink") + os.symlink("link_target", path) + tarinfo = self.dst.gettarinfo(path) + self.assertEqual(tarinfo.size, 0) + + class WriteStreamTest(WriteTest): sep = '|' @@ -366,6 +400,7 @@ def test_main(): ReadTest, ReadStreamTest, WriteTest, + WriteSize0Test, WriteStreamTest, WriteGNULongTest, ] diff --git a/Misc/NEWS b/Misc/NEWS index 69a5686..9ea848b 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -79,6 +79,8 @@ Extension Modules Library ------- +- Bug #1167128: Fix size of a symlink in a tarfile to be 0. + - Patch #810023: Fix off-by-one bug in urllib.urlretrieve reporthook functionality. -- cgit v0.12