From: Martin v. Löwis Date: Sat, 27 Aug 2005 10:08:21 +0000 (+0000) Subject: Patch #1168594: set sizes of non-regular files to zero. Fixes #1167128. X-Git-Tag: v2.4.2c1~60 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bd94eb52d17f8fddd6e60d87b6bce5354a297cf2;p=thirdparty%2FPython%2Fcpython.git Patch #1168594: set sizes of non-regular files to zero. Fixes #1167128. --- diff --git a/Lib/tarfile.py b/Lib/tarfile.py index 366a244ab5a9..ce4d02feb429 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 0fae5efcd401..c0d9ecad47ca 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 69a5686d1d3d..9ea848bfd9b7 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.