Commit afe5f633 authored by Bo Bayles's avatar Bo Bayles Committed by Serhiy Storchaka

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

parent d7e783b1
...@@ -95,9 +95,8 @@ class GzipFile(io.BufferedIOBase): ...@@ -95,9 +95,8 @@ class GzipFile(io.BufferedIOBase):
if filename is None: if filename is None:
# Issue #13781: os.fdopen() creates a fileobj with a bogus name # Issue #13781: os.fdopen() creates a fileobj with a bogus name
# attribute. Avoid saving this in the gzip header's filename field. # attribute. Avoid saving this in the gzip header's filename field.
if hasattr(fileobj, 'name') and fileobj.name != '<fdopen>': filename = getattr(fileobj, 'name', '')
filename = fileobj.name if not isinstance(filename, basestring) or filename == '<fdopen>':
else:
filename = '' filename = ''
if mode is None: if mode is None:
if hasattr(fileobj, 'mode'): mode = fileobj.mode if hasattr(fileobj, 'mode'): mode = fileobj.mode
......
...@@ -6,6 +6,7 @@ from test import test_support ...@@ -6,6 +6,7 @@ from test import test_support
import os import os
import io import io
import struct import struct
import tempfile
gzip = test_support.import_module('gzip') gzip = test_support.import_module('gzip')
data1 = """ int length=DEFAULTALLOC, err = Z_OK; data1 = """ int length=DEFAULTALLOC, err = Z_OK;
...@@ -331,6 +332,12 @@ class TestGzip(unittest.TestCase): ...@@ -331,6 +332,12 @@ class TestGzip(unittest.TestCase):
with gzip.GzipFile(fileobj=f, mode="w") as g: with gzip.GzipFile(fileobj=f, mode="w") as g:
self.assertEqual(g.name, "") 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): def test_fileobj_mode(self):
gzip.GzipFile(self.filename, "wb").close() gzip.GzipFile(self.filename, "wb").close()
with open(self.filename, "r+b") as f: with open(self.filename, "r+b") as f:
...@@ -359,6 +366,14 @@ class TestGzip(unittest.TestCase): ...@@ -359,6 +366,14 @@ class TestGzip(unittest.TestCase):
with gzip.GzipFile(fileobj=io.BytesIO(gzdata)) as f: with gzip.GzipFile(fileobj=io.BytesIO(gzdata)) as f:
self.assertEqual(f.read(), b'Test') 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): def test_main(verbose=None):
test_support.run_unittest(TestGzip) test_support.run_unittest(TestGzip)
......
...@@ -94,6 +94,7 @@ Michael R Bax ...@@ -94,6 +94,7 @@ Michael R Bax
Anthony Baxter Anthony Baxter
Mike Bayer Mike Bayer
Samuel L. Bayer Samuel L. Bayer
Bo Bayles
Donald Beaudry Donald Beaudry
David Beazley David Beazley
Carlo Beccarini Carlo Beccarini
......
gzip.GzipFile no longer produces an AttributeError exception when used with
a file object with a non-string name attribute. Patch by Bo Bayles.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment