]> granicus.if.org Git - python/commitdiff
Issue 21044: tarfile.open() now handles fileobj with an integer 'name'
authorSerhiy Storchaka <storchaka@gmail.com>
Wed, 16 Jul 2014 20:58:12 +0000 (23:58 +0300)
committerSerhiy Storchaka <storchaka@gmail.com>
Wed, 16 Jul 2014 20:58:12 +0000 (23:58 +0300)
attribute.  Based on patch by Martin Panter.

Lib/tarfile.py
Lib/test/test_tarfile.py
Misc/ACKS
Misc/NEWS

index 57ea877911b38df8c3f1d11088b82bf7675f9ebc..db5ff7f9a4c148ac590a9b7e373e2b83fd82d36d 100644 (file)
@@ -1522,7 +1522,8 @@ class TarFile(object):
             fileobj = bltn_open(name, self._mode)
             self._extfileobj = False
         else:
-            if name is None and hasattr(fileobj, "name"):
+            if (name is None and hasattr(fileobj, "name") and
+                isinstance(fileobj.name, basestring)):
                 name = fileobj.name
             if hasattr(fileobj, "mode"):
                 self._mode = fileobj.mode
index ff3265fc0ee324e21102090b71b86288a6c6fef0..7d13398e929713396e023b7636f6023f46c81ea4 100644 (file)
@@ -1,6 +1,7 @@
 # -*- coding: iso-8859-15 -*-
 
 import sys
+import io
 import os
 import shutil
 import StringIO
@@ -289,24 +290,49 @@ class CommonReadTest(ReadTest):
 class MiscReadTest(CommonReadTest):
     taropen = tarfile.TarFile.taropen
 
+    def requires_name_attribute(self):
+        pass
+
     def test_no_name_argument(self):
-        fobj = open(self.tarname, "rb")
-        tar = tarfile.open(fileobj=fobj, mode=self.mode)
-        self.assertEqual(tar.name, os.path.abspath(fobj.name))
+        self.requires_name_attribute()
+        with open(self.tarname, "rb") as fobj:
+            self.assertIsInstance(fobj.name, str)
+            with tarfile.open(fileobj=fobj, mode=self.mode) as tar:
+                self.assertIsInstance(tar.name, str)
+                self.assertEqual(tar.name, os.path.abspath(fobj.name))
 
     def test_no_name_attribute(self):
         data = open(self.tarname, "rb").read()
         fobj = StringIO.StringIO(data)
         self.assertRaises(AttributeError, getattr, fobj, "name")
         tar = tarfile.open(fileobj=fobj, mode=self.mode)
-        self.assertEqual(tar.name, None)
+        self.assertIsNone(tar.name)
 
     def test_empty_name_attribute(self):
         data = open(self.tarname, "rb").read()
         fobj = StringIO.StringIO(data)
         fobj.name = ""
         tar = tarfile.open(fileobj=fobj, mode=self.mode)
-        self.assertEqual(tar.name, None)
+        self.assertIsNone(tar.name)
+
+    def test_int_name_attribute(self):
+        # Issue 21044: tarfile.open() should handle fileobj with an integer
+        # 'name' attribute.
+        fd = os.open(self.tarname, os.O_RDONLY)
+        with io.open(fd, 'rb') as fobj:
+            self.assertIsInstance(fobj.name, int)
+            with tarfile.open(fileobj=fobj, mode=self.mode) as tar:
+                self.assertIsNone(tar.name)
+
+    @test_support.requires_unicode
+    def test_unicode_name_attribute(self):
+        self.requires_name_attribute()
+        tarname = unicode(self.tarname, test_support.TESTFN_ENCODING)
+        with io.open(tarname, 'rb') as fobj:
+            self.assertIsInstance(fobj.name, unicode)
+            with tarfile.open(fileobj=fobj, mode=self.mode) as tar:
+                self.assertIsInstance(tar.name, unicode)
+                self.assertEqual(tar.name, os.path.abspath(fobj.name))
 
     def test_illegal_mode_arg(self):
         with open(tmpname, 'wb'):
@@ -1668,6 +1694,8 @@ class Bz2MiscReadTest(MiscReadTest):
     tarname = bz2name
     mode = "r:bz2"
     taropen = tarfile.TarFile.bz2open
+    def requires_name_attribute(self):
+        self.skipTest("BZ2File have no name attribute")
 class Bz2UstarReadTest(UstarReadTest):
     tarname = bz2name
     mode = "r:bz2"
index 59f75cfa66b772d38df6ab17bd9b6d2ae60d160c..27be9493f08cd7fdccab2345f4673ca708215ec0 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -995,6 +995,7 @@ Mike Pall
 Todd R. Palmer
 Juan David Ibáñez Palomar
 Jan Palus
+Martin Panter
 Mathias Panzenböck
 M. Papillon
 Peter Parente
index 0b78b5ffcb6bdaaf0311ed3000a835f6a9d51e9f..d2fc3e2938171ffac13d6ad78a0838078dc6e4d3 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -13,6 +13,9 @@ Core and Builtins
 Library
 -------
 
+- Issue 21044: tarfile.open() now handles fileobj with an integer 'name'
+  attribute.  Based on patch by Martin Panter.
+
 - Issue #21151: Fixed a segfault in the _winreg module when ``None`` is passed
   as a ``REG_BINARY`` value to SetValueEx.  Patch by John Ehresman.