Skip to content

Commit 431c18b

Browse files
committed
ValueError is now raised if mtime is a naive datetime object
1 parent 8ca46af commit 431c18b

File tree

3 files changed

+24
-2
lines changed

3 files changed

+24
-2
lines changed

Doc/library/gzip.rst

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,8 @@ The module defines the following items:
107107

108108
.. versionchanged:: next
109109
The *mtime* parameter can now be a :class:`~datetime.datetime` object as well
110-
as a :class:`float`.
110+
as a :class:`float`. If not :ref:`timezone aware <datetime-naive-aware>` then a
111+
:class:`ValueError` will be raised.
111112

112113
See below for the :attr:`mtime` attribute that is set when decompressing.
113114

@@ -215,7 +216,8 @@ The module defines the following items:
215216

216217
.. versionchanged:: next
217218
The *mtime* parameter can now be a :class:`~datetime.datetime` object as well
218-
as a :class:`float`.
219+
as a :class:`float`. If not :ref:`timezone aware <datetime-naive-aware>` then a
220+
:class:`ValueError` will be raised.
219221

220222
.. function:: decompress(data)
221223

Lib/gzip.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,8 @@ def _write_gzip_header(self, compresslevel):
281281
if mtime is None:
282282
mtime = time.time()
283283
elif isinstance(mtime, datetime):
284+
if mtime.tzinfo is None:
285+
raise ValueError("Refusing to write naive datetime to Gzip header")
284286
mtime = mtime.timestamp()
285287
write32u(self.fileobj, int(mtime))
286288
if compresslevel == _COMPRESS_LEVEL_BEST:
@@ -596,6 +598,8 @@ def compress(data, compresslevel=_COMPRESS_LEVEL_BEST, *, mtime=0):
596598
if mtime is None:
597599
mtime = time.time()
598600
elif isinstance(mtime, datetime):
601+
if mtime.tzinfo is None:
602+
raise ValueError("Refusing to write naive datetime to Gzip header")
599603
mtime = mtime.timestamp()
600604
# Reuse gzip header created by zlib, replace mtime and OS byte for
601605
# consistency.

Lib/test/test_gzip.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,13 @@ def test_mtime_as_datetime(self):
328328
self.assertEqual(dataRead, data1)
329329
self.assertEqual(fRead.mtime, int(mtime.timestamp()))
330330

331+
def test_mtime_as_datetime_no_timezone(self):
332+
mtime = datetime(1973, 11, 29, 21, 33, 9)
333+
self.assertIsNone(mtime.tzinfo)
334+
with self.assertRaises(ValueError):
335+
with gzip.GzipFile(self.filename, 'w', mtime = mtime) as fWrite:
336+
fWrite.write(data1)
337+
331338
def test_metadata(self):
332339
mtime = 123456789
333340

@@ -736,6 +743,15 @@ def test_compress_mtime_as_datetime(self):
736743
f.read(1) # to set mtime attribute
737744
self.assertEqual(f.mtime, int(mtime.timestamp()))
738745

746+
def test_compress_mtime_as_datetime_no_timezone(self):
747+
mtime = datetime(1973, 11, 29, 21, 33, 9)
748+
self.assertIsNone(mtime.tzinfo)
749+
for data in [data1, data2]:
750+
for args in [(), (1,), (6,), (9,)]:
751+
with self.subTest(data=data, args=args):
752+
with self.assertRaises(ValueError):
753+
gzip.compress(data, *args, mtime=mtime)
754+
739755
def test_compress_mtime_default(self):
740756
# test for gh-125260
741757
datac = gzip.compress(data1, mtime=0)

0 commit comments

Comments
 (0)