OSDir

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Python-Dev] [Python-checkins] bpo-33038: Fix gzip.GzipFile for file objects with a non-string name attribute. (GH-6095)



      From: Serhiy Storchaka <webhook-mailer at python.org>
 To: python-checkins at python.org 
 Sent: Wednesday, 9 May 2018, 10:14
 Subject: [Python-checkins] bpo-33038: Fix gzip.GzipFile for file objects with a non-string name attribute. (GH-6095)
   
https://github.com/python/cpython/commit/afe5f633e49e0e873d42088ae56819609c803ba0
commit: afe5f633e49e0e873d42088ae56819609c803ba0
branch: 2.7
author: Bo Bayles <bbayles at gmail.com>
committer: Serhiy Storchaka <storchaka at gmail.com>
date: 2018-05-09T13:14:40+03:00
summary:

bpo-33038: Fix gzip.GzipFile for file objects with a non-string name attribute. (GH-6095)

files:
A Misc/NEWS.d/next/Library/2018-03-10-20-14-36.bpo-33038.yA6CP5.rst
M Lib/gzip.py
M Lib/test/test_gzip.py
M Misc/ACKS

diff --git a/Lib/gzip.py b/Lib/gzip.py
index 07c6db493b0b..76ace394f482 100644
--- a/Lib/gzip.py
+++ b/Lib/gzip.py
@@ -95,9 +95,8 @@ def __init__(self, filename=None, mode=None,
? ? ? ? if filename is None:
? ? ? ? ? ? # Issue #13781: os.fdopen() creates a fileobj with a bogus name
? ? ? ? ? ? # attribute. Avoid saving this in the gzip header's filename field.
-? ? ? ? ? ? if hasattr(fileobj, 'name') and fileobj.name != '<fdopen>':
-? ? ? ? ? ? ? ? filename = fileobj.name
-? ? ? ? ? ? else:
+? ? ? ? ? ? filename = getattr(fileobj, 'name', '')
+? ? ? ? ? ? if not isinstance(filename, basestring) or filename == '<fdopen>':
? ? ? ? ? ? ? ? filename = ''
? ? ? ? if mode is None:
? ? ? ? ? ? if hasattr(fileobj, 'mode'): mode = fileobj.mode
diff --git a/Lib/test/test_gzip.py b/Lib/test/test_gzip.py
index 902d93fe043f..cdb1af5c3d13 100644
--- a/Lib/test/test_gzip.py
+++ b/Lib/test/test_gzip.py
@@ -6,6 +6,7 @@
 import os
 import io
 import struct
+import tempfile
 gzip = test_support.import_module('gzip')
 
 data1 = """? int length=DEFAULTALLOC, err = Z_OK;
@@ -331,6 +332,12 @@ def test_fileobj_from_fdopen(self):
? ? ? ? ? ? with gzip.GzipFile(fileobj=f, mode="w") as g:
? ? ? ? ? ? ? ? self.assertEqual(g.name, "")
 
+? ? def test_fileobj_from_io_open(self):
+? ? ? ? fd = os.open(self.filename, os.O_WRONLY | os.O_CREAT)
+? ? ? ? with io.open(fd, "wb") as f:
+? ? ? ? ? ? with gzip.GzipFile(fileobj=f, mode="w") as g:
+? ? ? ? ? ? ? ? self.assertEqual(g.name, "")
+
? ? def test_fileobj_mode(self):
? ? ? ? gzip.GzipFile(self.filename, "wb").close()
? ? ? ? with open(self.filename, "r+b") as f:
@@ -359,6 +366,14 @@ def test_read_with_extra(self):
? ? ? ? with gzip.GzipFile(fileobj=io.BytesIO(gzdata)) as f:
? ? ? ? ? ? self.assertEqual(f.read(), b'Test')
 
+? ? def test_fileobj_without_name(self):
+? ? ? ? # Issue #33038: GzipFile should not assume that file objects that have
+? ? ? ? # a .name attribute use a non-None value.
+? ? ? ? with tempfile.SpooledTemporaryFile() as f:
+? ? ? ? ? ? with gzip.GzipFile(fileobj=f, mode='wb') as archive:
+? ? ? ? ? ? ? ? archive.write(b'data')
+? ? ? ? ? ? ? ? self.assertEqual(archive.name, '')
+
 def test_main(verbose=None):
? ? test_support.run_unittest(TestGzip)
 
diff --git a/Misc/ACKS b/Misc/ACKS
index 580b0c5bf76d..458f31e6a6b7 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -94,6 +94,7 @@ Michael R Bax
 Anthony Baxter
 Mike Bayer
 Samuel L. Bayer
+Bo Bayles
 Donald Beaudry
 David Beazley
 Carlo Beccarini
diff --git a/Misc/NEWS.d/next/Library/2018-03-10-20-14-36.bpo-33038.yA6CP5.rst b/Misc/NEWS.d/next/Library/2018-03-10-20-14-36.bpo-33038.yA6CP5.rst
new file mode 100644
index 000000000000..22d394b85ab7
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2018-03-10-20-14-36.bpo-33038.yA6CP5.rst
@@ -0,0 +1,2 @@
+gzip.GzipFile no longer produces an AttributeError exception when used with
+a file object with a non-string name attribute. Patch by Bo Bayles.

_______________________________________________
Python-checkins mailing list
Python-checkins at python.org
https://mail.python.org/mailman/listinfo/python-checkins


   
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20180509/674e4dc3/attachment.html>