Issue #5148: Ignore 'U' in mode given to gzip.open() and gzip.GzipFile().
diff --git a/Lib/gzip.py b/Lib/gzip.py
index 8fdac83..2ae7c0c 100644
--- a/Lib/gzip.py
+++ b/Lib/gzip.py
@@ -81,6 +81,10 @@
"""
+ # Make sure we don't inadvertently enable universal newlines on the
+ # underlying file object - in read mode, this causes data corruption.
+ if mode:
+ mode = mode.replace('U', '')
# guarantee the file is opened in binary mode on platforms
# that care about that sort of thing
if mode and 'b' not in mode:
diff --git a/Lib/test/test_gzip.py b/Lib/test/test_gzip.py
index a28cd34..9f7bfd2 100644
--- a/Lib/test/test_gzip.py
+++ b/Lib/test/test_gzip.py
@@ -53,6 +53,13 @@
d = f.read()
self.assertEqual(d, data1*50)
+ def test_read_universal_newlines(self):
+ # Issue #5148: Reading breaks when mode contains 'U'.
+ self.test_write()
+ with gzip.GzipFile(self.filename, 'rU') as f:
+ d = f.read()
+ self.assertEqual(d, data1*50)
+
def test_io_on_closed_object(self):
# Test that I/O operations on closed GzipFile objects raise a
# ValueError, just like the corresponding functions on file objects.