Skip to content

Commit

Permalink
Issue python#26709: Fixed Y2038 problem in loading binary PLists.
Browse files Browse the repository at this point in the history
  • Loading branch information
serhiy-storchaka committed Apr 8, 2016
1 parent 152a19c commit 94ad49f
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 1 deletion.
2 changes: 1 addition & 1 deletion Lib/plistlib.py
Original file line number Diff line number Diff line change
Expand Up @@ -685,7 +685,7 @@ def _read_object(self, offset):
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)
Expand Down
9 changes: 9 additions & 0 deletions Lib/test/test_plistlib.py
Original file line number Diff line number Diff line change
Expand Up @@ -428,6 +428,15 @@ def test_nonstandard_refs_size(self):
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):
Expand Down
2 changes: 2 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,8 @@ Core and Builtins
Library
-------

- Issue #26709: Fixed Y2038 problem in loading binary PLists.

- Issue #23735: Handle terminal resizing with Readline 6.3+ by installing our
own SIGWINCH handler. Patch by Eric Price.

Expand Down

0 comments on commit 94ad49f

Please sign in to comment.