diff options
author | Martin v. Löwis <martin@v.loewis.de> | 2005-08-24 06:06:52 (GMT) |
---|---|---|
committer | Martin v. Löwis <martin@v.loewis.de> | 2005-08-24 06:06:52 (GMT) |
commit | bc3b06087cf1907d1dfee6e21885a9ccfbf11af3 (patch) | |
tree | 86854ea8d1390fcbe52c69b04450afc7962acb9f /Lib | |
parent | 94ac197531fdc7f358e737dec55cd7158cbdd815 (diff) | |
download | cpython-bc3b06087cf1907d1dfee6e21885a9ccfbf11af3.zip cpython-bc3b06087cf1907d1dfee6e21885a9ccfbf11af3.tar.gz cpython-bc3b06087cf1907d1dfee6e21885a9ccfbf11af3.tar.bz2 |
Patch #1262036: Make tarfile name absolute. Fixes #1257255.
Will backport to 2.4.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/tarfile.py | 27 |
1 files changed, 7 insertions, 20 deletions
diff --git a/Lib/tarfile.py b/Lib/tarfile.py index e4c5863..9c25962 100644 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -849,7 +849,7 @@ class TarFile(object): can be determined, `mode' is overridden by `fileobj's mode. `fileobj' is not closed, when TarFile is closed. """ - self.name = name + self.name = os.path.abspath(name) if len(mode) > 1 or mode not in "raw": raise ValueError, "mode must be 'r', 'a' or 'w'" @@ -861,7 +861,7 @@ class TarFile(object): self._extfileobj = False else: if self.name is None and hasattr(fileobj, "name"): - self.name = fileobj.name + self.name = os.path.abspath(fileobj.name) if hasattr(fileobj, "mode"): self.mode = fileobj.mode self._extfileobj = True @@ -998,22 +998,18 @@ class TarFile(object): raise CompressionError, "gzip module is not available" pre, ext = os.path.splitext(name) - pre = os.path.basename(pre) if ext == ".tgz": ext = ".tar" if ext == ".gz": ext = "" - tarname = pre + ext + tarname = os.path.basename(pre + ext) if fileobj is None: fileobj = file(name, mode + "b") - if mode != "r": - name = tarname - try: - t = cls.taropen(tarname, mode, - gzip.GzipFile(name, mode, compresslevel, fileobj) + t = cls.taropen(name, mode, + gzip.GzipFile(tarname, mode, compresslevel, fileobj) ) except IOError: raise ReadError, "not a gzip file" @@ -1033,19 +1029,11 @@ class TarFile(object): except ImportError: raise CompressionError, "bz2 module is not available" - pre, ext = os.path.splitext(name) - pre = os.path.basename(pre) - if ext == ".tbz2": - ext = ".tar" - if ext == ".bz2": - ext = "" - tarname = pre + ext - if fileobj is not None: raise ValueError, "no support for external file objects" try: - t = cls.taropen(tarname, mode, bz2.BZ2File(name, mode, compresslevel=compresslevel)) + t = cls.taropen(name, mode, bz2.BZ2File(name, mode, compresslevel=compresslevel)) except IOError: raise ReadError, "not a bzip2 file" t._extfileobj = False @@ -1250,8 +1238,7 @@ class TarFile(object): arcname = name # Skip if somebody tries to archive the archive... - if self.name is not None \ - and os.path.abspath(name) == os.path.abspath(self.name): + if self.name is not None and os.path.samefile(name, self.name): self._dbg(2, "tarfile: Skipped %r" % name) return |