mirror of https://github.com/python/cpython
Issue #26709: Fixed Y2038 problem in loading binary PLists.
This commit is contained in:
parent
152a19c6bd
commit
94ad49fabc
|
@ -685,7 +685,7 @@ class _BinaryPlistParser:
|
|||
f = struct.unpack('>d', self._fp.read(8))[0]
|
||||
# timestamp 0 of binary plists corresponds to 1/1/2001
|
||||
# (year of Mac OS X 10.0), instead of 1/1/1970.
|
||||
return datetime.datetime.utcfromtimestamp(f + (31 * 365 + 8) * 86400)
|
||||
return datetime.datetime(2001, 1, 1) + datetime.timedelta(seconds=f)
|
||||
|
||||
elif tokenH == 0x40: # data
|
||||
s = self._get_size(tokenL)
|
||||
|
|
|
@ -428,6 +428,15 @@ class TestPlistlib(unittest.TestCase):
|
|||
b'\x00\x00\x00\x00\x00\x00\x00\x13')
|
||||
self.assertEqual(plistlib.loads(data), {'a': 'b'})
|
||||
|
||||
def test_large_timestamp(self):
|
||||
# Issue #26709: 32-bit timestamp out of range
|
||||
for ts in -2**31-1, 2**31:
|
||||
with self.subTest(ts=ts):
|
||||
d = (datetime.datetime.utcfromtimestamp(0) +
|
||||
datetime.timedelta(seconds=ts))
|
||||
data = plistlib.dumps(d, fmt=plistlib.FMT_BINARY)
|
||||
self.assertEqual(plistlib.loads(data), d)
|
||||
|
||||
|
||||
class TestPlistlibDeprecated(unittest.TestCase):
|
||||
def test_io_deprecated(self):
|
||||
|
|
Loading…
Reference in New Issue