mirror of
https://github.com/msgpack/msgpack-python.git
synced 2026-02-06 17:59:52 +00:00
Fix overflow in unpacking timestamp to datetime (#452)
This commit is contained in:
parent
8029f95516
commit
753b3706d8
2 changed files with 14 additions and 3 deletions
|
|
@ -342,21 +342,21 @@ static int unpack_callback_ext(unpack_user* u, const char* base, const char* pos
|
|||
py = PyObject_CallFunction(u->timestamp_t, "(Lk)", ts.tv_sec, ts.tv_nsec);
|
||||
}
|
||||
else if (u->timestamp == 3) { // datetime
|
||||
// Calculate datetime using epoch + delta
|
||||
// Calculate datetime using epoch + delta
|
||||
// due to limitations PyDateTime_FromTimestamp on Windows with negative timestamps
|
||||
PyObject *epoch = PyDateTimeAPI->DateTime_FromDateAndTime(1970, 1, 1, 0, 0, 0, 0, u->utc, PyDateTimeAPI->DateTimeType);
|
||||
if (epoch == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
PyObject* d = PyDelta_FromDSU(0, ts.tv_sec, ts.tv_nsec / 1000);
|
||||
PyObject* d = PyDelta_FromDSU(ts.tv_sec/(24*3600), ts.tv_sec%(24*3600), ts.tv_nsec / 1000);
|
||||
if (d == NULL) {
|
||||
Py_DECREF(epoch);
|
||||
return -1;
|
||||
}
|
||||
|
||||
py = PyNumber_Add(epoch, d);
|
||||
|
||||
|
||||
Py_DECREF(epoch);
|
||||
Py_DECREF(d);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -129,3 +129,14 @@ def test_pack_datetime():
|
|||
assert x
|
||||
assert x[0] == dt
|
||||
assert msgpack.unpackb(packed) is None
|
||||
|
||||
|
||||
@pytest.mark.skipif(sys.version_info[0] == 2, reason="datetime support is PY3+ only")
|
||||
def test_issue451():
|
||||
# https://github.com/msgpack/msgpack-python/issues/451
|
||||
dt = datetime.datetime(2100, 1, 1, 1, 1, tzinfo=_utc)
|
||||
packed = msgpack.packb(dt, datetime=True)
|
||||
assert packed == b"\xd6\xff\xf4\x86eL"
|
||||
|
||||
unpacked = msgpack.unpackb(packed, timestamp=3)
|
||||
assert dt == unpacked
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue