summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2014-07-17 00:00:26 +0300
committerSerhiy Storchaka <storchaka@gmail.com>2014-07-17 00:00:26 +0300
commita98faefd68da474d5155979f5f9174f98bb6227b (patch)
tree8e5ea7a584f4073f1eb1eb858b749d410a6183c4
parent05d7d156266ac561e988ed84d6fbaf044541d855 (diff)
parent2c6a3aedeb47ce763454f936545b6dddabbe29cb (diff)
downloadcpython-git-a98faefd68da474d5155979f5f9174f98bb6227b.tar.gz
Issue 21044: tarfile.open() now handles fileobj with an integer 'name'
attribute. Based on patch by Martin Panter.
-rwxr-xr-xLib/tarfile.py3
-rw-r--r--Lib/test/test_tarfile.py36
-rw-r--r--Misc/ACKS1
-rw-r--r--Misc/NEWS3
4 files changed, 36 insertions, 7 deletions
diff --git a/Lib/tarfile.py b/Lib/tarfile.py
index 0a9025774d..9e291c2a58 100755
--- a/Lib/tarfile.py
+++ b/Lib/tarfile.py
@@ -1423,7 +1423,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, (str, bytes))):
name = fileobj.name
if hasattr(fileobj, "mode"):
self._mode = fileobj.mode
diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py
index d828979c47..e527e403fa 100644
--- a/Lib/test/test_tarfile.py
+++ b/Lib/test/test_tarfile.py
@@ -351,10 +351,16 @@ class CommonReadTest(ReadTest):
class MiscReadTestBase(CommonReadTest):
+ def requires_name_attribute(self):
+ pass
+
def test_no_name_argument(self):
+ self.requires_name_attribute()
with open(self.tarname, "rb") as fobj:
- tar = tarfile.open(fileobj=fobj, mode=self.mode)
- self.assertEqual(tar.name, os.path.abspath(fobj.name))
+ 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):
with open(self.tarname, "rb") as fobj:
@@ -362,7 +368,7 @@ class MiscReadTestBase(CommonReadTest):
fobj = io.BytesIO(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):
with open(self.tarname, "rb") as fobj:
@@ -370,7 +376,25 @@ class MiscReadTestBase(CommonReadTest):
fobj = io.BytesIO(data)
fobj.name = ""
with tarfile.open(fileobj=fobj, mode=self.mode) as tar:
- 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 open(fd, 'rb') as fobj:
+ self.assertIsInstance(fobj.name, int)
+ with tarfile.open(fileobj=fobj, mode=self.mode) as tar:
+ self.assertIsNone(tar.name)
+
+ def test_bytes_name_attribute(self):
+ self.requires_name_attribute()
+ tarname = os.fsencode(self.tarname)
+ with open(tarname, 'rb') as fobj:
+ self.assertIsInstance(fobj.name, bytes)
+ with tarfile.open(fileobj=fobj, mode=self.mode) as tar:
+ self.assertIsInstance(tar.name, bytes)
+ self.assertEqual(tar.name, os.path.abspath(fobj.name))
def test_illegal_mode_arg(self):
with open(tmpname, 'wb'):
@@ -548,11 +572,11 @@ class GzipMiscReadTest(GzipTest, MiscReadTestBase, unittest.TestCase):
pass
class Bz2MiscReadTest(Bz2Test, MiscReadTestBase, unittest.TestCase):
- def test_no_name_argument(self):
+ def requires_name_attribute(self):
self.skipTest("BZ2File have no name attribute")
class LzmaMiscReadTest(LzmaTest, MiscReadTestBase, unittest.TestCase):
- def test_no_name_argument(self):
+ def requires_name_attribute(self):
self.skipTest("LZMAFile have no name attribute")
diff --git a/Misc/ACKS b/Misc/ACKS
index 16ed78fbbf..844ea44970 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -1004,6 +1004,7 @@ Mike Pall
Todd R. Palmer
Juan David Ibáñez Palomar
Jan Palus
+Martin Panter
Mathias Panzenböck
M. Papillon
Peter Parente
diff --git a/Misc/NEWS b/Misc/NEWS
index 83c629f2de..80d66d006b 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -108,6 +108,9 @@ Core and Builtins
Library
-------
+- Issue 21044: tarfile.open() now handles fileobj with an integer 'name'
+ attribute. Based on patch by Martin Panter.
+
- Issue #21966: Respect -q command-line option when code module is ran.
- Issue #19076: Don't pass the redundant 'file' argument to self.error().