Skip to content

Commit ac896a5

Browse files
committed
fixup: Compatible pickle for packed struct
1 parent dbbaf7a commit ac896a5

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

Modules/_datetimemodule.c

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2786,6 +2786,7 @@ date_from_pickle(PyTypeObject *type, PyObject *state)
27862786
if (me != NULL) {
27872787
const char *pdata = PyBytes_AS_STRING(state);
27882788
memcpy(&me->data, pdata, _PyDateTime_DATE_DATASIZE);
2789+
me->data.year = be16toh(me->data.year);
27892790
me->hashcode = -1;
27902791
}
27912792
return (PyObject *)me;
@@ -3453,7 +3454,9 @@ static PyObject *
34533454
date_getstate(PyDateTime_Date *self)
34543455
{
34553456
PyObject* field;
3456-
field = PyBytes_FromStringAndSize((char*)&self->data,
3457+
_PyDateTime_DateData tmp = self->data;
3458+
tmp.year = htobe16(tmp.year);
3459+
field = PyBytes_FromStringAndSize((char*)&tmp,
34573460
_PyDateTime_DATE_DATASIZE);
34583461
return Py_BuildValue("(N)", field);
34593462
}
@@ -4151,6 +4154,7 @@ time_from_pickle(PyTypeObject *type, PyObject *state, PyObject *tzinfo)
41514154
const char *pdata = PyBytes_AS_STRING(state);
41524155

41534156
memcpy(&me->data, pdata, _PyDateTime_TIME_DATASIZE);
4157+
me->data.microsecond = be32toh(me->data.microsecond) >> 8;
41544158
me->hashcode = -1;
41554159
me->hastzinfo = aware;
41564160
if (aware) {
@@ -4620,7 +4624,9 @@ time_getstate(PyDateTime_Time *self, int proto)
46204624
PyObject *basestate;
46214625
PyObject *result = NULL;
46224626

4623-
basestate = PyBytes_FromStringAndSize((char *)&self->data,
4627+
_PyDateTime_TimeData tmp = self->data;
4628+
tmp.microsecond = htobe32(tmp.microsecond << 8);
4629+
basestate = PyBytes_FromStringAndSize((char *)&tmp,
46244630
_PyDateTime_TIME_DATASIZE);
46254631
if (basestate != NULL) {
46264632
if (proto > 3 && TIME_GET_FOLD(self))
@@ -4817,6 +4823,8 @@ datetime_from_pickle(PyTypeObject *type, PyObject *state, PyObject *tzinfo)
48174823
const char *pdata = PyBytes_AS_STRING(state);
48184824

48194825
memcpy(&me->data, pdata, _PyDateTime_DATETIME_DATASIZE);
4826+
me->data.year = be16toh(me->data.year);
4827+
me->data.microsecond = be32toh(me->data.microsecond) >> 8;
48204828
me->hashcode = -1;
48214829
me->hastzinfo = aware;
48224830
if (aware) {
@@ -6273,7 +6281,10 @@ datetime_getstate(PyDateTime_DateTime *self, int proto)
62736281
PyObject *basestate;
62746282
PyObject *result = NULL;
62756283

6276-
basestate = PyBytes_FromStringAndSize((char *)&self->data,
6284+
_PyDateTime_DateTimeData tmp = self->data;
6285+
tmp.year = htobe16(tmp.year);
6286+
tmp.microsecond = htobe32(tmp.microsecond << 8);
6287+
basestate = PyBytes_FromStringAndSize((char *)&tmp,
62776288
_PyDateTime_DATETIME_DATASIZE);
62786289
if (basestate != NULL) {
62796290
if (proto > 3 && DATE_GET_FOLD(self))

0 commit comments

Comments
 (0)