Skip to content

Commit fff103b

Browse files
committed
fixup: Compatible pickle for packed struct
1 parent 6924e89 commit fff103b

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
@@ -3191,6 +3191,7 @@ date_from_pickle(PyTypeObject *type, PyObject *state)
31913191
if (me != NULL) {
31923192
const char *pdata = PyBytes_AS_STRING(state);
31933193
memcpy(&me->data, pdata, _PyDateTime_DATE_DATASIZE);
3194+
me->data.year = be16toh(me->data.year);
31943195
me->hashcode = -1;
31953196
}
31963197
return (PyObject *)me;
@@ -3966,7 +3967,9 @@ static PyObject *
39663967
date_getstate(PyDateTime_Date *self)
39673968
{
39683969
PyObject* field;
3969-
field = PyBytes_FromStringAndSize((char*)&self->data,
3970+
_PyDateTime_DateData tmp = self->data;
3971+
tmp.year = htobe16(tmp.year);
3972+
field = PyBytes_FromStringAndSize((char*)&tmp,
39703973
_PyDateTime_DATE_DATASIZE);
39713974
return Py_BuildValue("(N)", field);
39723975
}
@@ -4652,6 +4655,7 @@ time_from_pickle(PyTypeObject *type, PyObject *state, PyObject *tzinfo)
46524655
const char *pdata = PyBytes_AS_STRING(state);
46534656

46544657
memcpy(&me->data, pdata, _PyDateTime_TIME_DATASIZE);
4658+
me->data.microsecond = be32toh(me->data.microsecond) >> 8;
46554659
me->hashcode = -1;
46564660
me->hastzinfo = aware;
46574661
if (aware) {
@@ -5232,7 +5236,9 @@ time_getstate(PyDateTime_Time *self, int proto)
52325236
PyObject *basestate;
52335237
PyObject *result = NULL;
52345238

5235-
basestate = PyBytes_FromStringAndSize((char *)&self->data,
5239+
_PyDateTime_TimeData tmp = self->data;
5240+
tmp.microsecond = htobe32(tmp.microsecond << 8);
5241+
basestate = PyBytes_FromStringAndSize((char *)&tmp,
52365242
_PyDateTime_TIME_DATASIZE);
52375243
if (basestate != NULL) {
52385244
if (proto > 3 && TIME_GET_FOLD(self))
@@ -5428,6 +5434,8 @@ datetime_from_pickle(PyTypeObject *type, PyObject *state, PyObject *tzinfo)
54285434
const char *pdata = PyBytes_AS_STRING(state);
54295435

54305436
memcpy(&me->data, pdata, _PyDateTime_DATETIME_DATASIZE);
5437+
me->data.year = be16toh(me->data.year);
5438+
me->data.microsecond = be32toh(me->data.microsecond) >> 8;
54315439
me->hashcode = -1;
54325440
me->hastzinfo = aware;
54335441
if (aware) {
@@ -7154,7 +7162,10 @@ datetime_getstate(PyDateTime_DateTime *self, int proto)
71547162
PyObject *basestate;
71557163
PyObject *result = NULL;
71567164

7157-
basestate = PyBytes_FromStringAndSize((char *)&self->data,
7165+
_PyDateTime_DateTimeData tmp = self->data;
7166+
tmp.year = htobe16(tmp.year);
7167+
tmp.microsecond = htobe32(tmp.microsecond << 8);
7168+
basestate = PyBytes_FromStringAndSize((char *)&tmp,
71587169
_PyDateTime_DATETIME_DATASIZE);
71597170
if (basestate != NULL) {
71607171
if (proto > 3 && DATE_GET_FOLD(self))

0 commit comments

Comments
 (0)