From bc3b06087cf1907d1dfee6e21885a9ccfbf11af3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= <martin@v.loewis.de>
Date: Wed, 24 Aug 2005 06:06:52 +0000
Subject: [PATCH] Patch #1262036: Make tarfile name absolute. Fixes #1257255.
 Will backport to 2.4.

---
 Lib/tarfile.py | 27 +++++++--------------------
 Misc/NEWS      |  2 ++
 2 files changed, 9 insertions(+), 20 deletions(-)

diff --git a/Lib/tarfile.py b/Lib/tarfile.py
index e4c58636c4..9c25962b89 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
 
diff --git a/Misc/NEWS b/Misc/NEWS
index 0171492925..6a3d68d8a5 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -188,6 +188,8 @@ Extension Modules
 Library
 -------
 
+- Patch #1262036: Make tarfile name absolute. Fixes #1257255.
+
 - Patch #827386: Support absolute source paths in msvccompiler.py.
 
 - Patch #1105730: Apply the new implementation of commonprefix in posixpath
-- 
2.18.1