From 47cddff3315d899828778ffcb1dc1b479265865e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Sat, 25 Jan 2025 15:16:28 +0100 Subject: [PATCH 1/8] fix UBSan failures for `Pdata` --- Modules/_pickle.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Modules/_pickle.c b/Modules/_pickle.c index a6cfb2deeb23c1..9c0dc301da2889 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -410,16 +410,19 @@ typedef struct { Py_ssize_t allocated; /* number of slots in data allocated */ } Pdata; +#define _Pdata_CAST(op) ((Pdata *)(op)) + static int -Pdata_traverse(Pdata *self, visitproc visit, void *arg) +Pdata_traverse(PyObject *self, visitproc visit, void *arg) { Py_VISIT(Py_TYPE(self)); return 0; } static void -Pdata_dealloc(Pdata *self) +Pdata_dealloc(PyObject *op) { + Pdata *self = _Pdata_CAST(op); PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); Py_ssize_t i = Py_SIZE(self); @@ -427,7 +430,7 @@ Pdata_dealloc(Pdata *self) Py_DECREF(self->data[i]); } PyMem_Free(self->data); - tp->tp_free((PyObject *)self); + tp->tp_free(self); Py_DECREF(tp); } From 61da4f215446cc767b4ebb7df57fa5072ae75213 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Sat, 25 Jan 2025 15:21:59 +0100 Subject: [PATCH 2/8] fix UBSan failures for `PicklerObject` --- Modules/_pickle.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/Modules/_pickle.c b/Modules/_pickle.c index 9c0dc301da2889..58d0329df9aba2 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -699,6 +699,8 @@ typedef struct { UnpicklerObject *unpickler; } UnpicklerMemoProxyObject; +#define _PicklerObject_CAST(op) ((PicklerObject *)(op)) + /* Forward declarations */ static int save(PickleState *state, PicklerObject *, PyObject *, int); static int save_reduce(PickleState *, PicklerObject *, PyObject *, PyObject *); @@ -4723,8 +4725,9 @@ static struct PyMethodDef Pickler_methods[] = { }; static int -Pickler_clear(PicklerObject *self) +Pickler_clear(PyObject *op) { + PicklerObject *self = _PicklerObject_CAST(op); Py_CLEAR(self->output_buffer); Py_CLEAR(self->write); Py_CLEAR(self->persistent_id); @@ -4742,18 +4745,19 @@ Pickler_clear(PicklerObject *self) } static void -Pickler_dealloc(PicklerObject *self) +Pickler_dealloc(PyObject *self) { PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); (void)Pickler_clear(self); - tp->tp_free((PyObject *)self); + tp->tp_free(self); Py_DECREF(tp); } static int -Pickler_traverse(PicklerObject *self, visitproc visit, void *arg) +Pickler_traverse(PyObject *op, visitproc visit, void *arg) { + PicklerObject *self = _PicklerObject_CAST(op); Py_VISIT(Py_TYPE(self)); Py_VISIT(self->write); Py_VISIT(self->persistent_id); @@ -4823,7 +4827,7 @@ _pickle_Pickler___init___impl(PicklerObject *self, PyObject *file, { /* In case of multiple __init__() calls, clear previous content. */ if (self->write != NULL) - (void)Pickler_clear(self); + (void)Pickler_clear((PyObject *)self); if (_Pickler_SetProtocol(self, protocol, fix_imports) < 0) return -1; @@ -5033,15 +5037,17 @@ PicklerMemoProxy_New(PicklerObject *pickler) /*****************************************************************************/ static PyObject * -Pickler_get_memo(PicklerObject *self, void *Py_UNUSED(ignored)) +Pickler_get_memo(PyObject *op, void *Py_UNUSED(ignored)) { + PicklerObject *self = _PicklerObject_CAST(op); return PicklerMemoProxy_New(self); } static int -Pickler_set_memo(PicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored)) +Pickler_set_memo(PyObject *op, PyObject *obj, void *Py_UNUSED(ignored)) { PyMemoTable *new_memo = NULL; + PicklerObject *self = _PicklerObject_CAST(op); if (obj == NULL) { PyErr_SetString(PyExc_TypeError, @@ -5104,11 +5110,12 @@ Pickler_set_memo(PicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored)) static PyObject * Pickler_getattr(PyObject *self, PyObject *name) { + PicklerObject *po = _PicklerObject_CAST(self); if (PyUnicode_Check(name) && PyUnicode_EqualToUTF8(name, "persistent_id") - && ((PicklerObject *)self)->persistent_id_attr) + && po->persistent_id_attr) { - return Py_NewRef(((PicklerObject *)self)->persistent_id_attr); + return Py_NewRef(po->persistent_id_attr); } return PyObject_GenericGetAttr(self, name); @@ -5120,8 +5127,9 @@ Pickler_setattr(PyObject *self, PyObject *name, PyObject *value) if (PyUnicode_Check(name) && PyUnicode_EqualToUTF8(name, "persistent_id")) { + PicklerObject *po = _PicklerObject_CAST(self); Py_XINCREF(value); - Py_XSETREF(((PicklerObject *)self)->persistent_id_attr, value); + Py_XSETREF(po->persistent_id_attr, value); return 0; } @@ -5136,8 +5144,7 @@ static PyMemberDef Pickler_members[] = { }; static PyGetSetDef Pickler_getsets[] = { - {"memo", (getter)Pickler_get_memo, - (setter)Pickler_set_memo}, + {"memo", Pickler_get_memo, Pickler_set_memo}, {NULL} }; From d1e782c76f31d3e1798d326307b4c2fb70b99155 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Sat, 25 Jan 2025 15:27:31 +0100 Subject: [PATCH 3/8] fix UBSan failures for `UnpicklerObject` --- Modules/_pickle.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/Modules/_pickle.c b/Modules/_pickle.c index 58d0329df9aba2..3d4af21dc25193 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -700,6 +700,7 @@ typedef struct { } UnpicklerMemoProxyObject; #define _PicklerObject_CAST(op) ((PicklerObject *)(op)) +#define _UnpicklerObject_CAST(op) ((UnpicklerObject *)(op)) /* Forward declarations */ static int save(PickleState *state, PicklerObject *, PyObject *, int); @@ -7229,8 +7230,9 @@ static struct PyMethodDef Unpickler_methods[] = { }; static int -Unpickler_clear(UnpicklerObject *self) +Unpickler_clear(PyObject *op) { + UnpicklerObject *self = _UnpicklerObject_CAST(op); Py_CLEAR(self->readline); Py_CLEAR(self->readinto); Py_CLEAR(self->read); @@ -7257,18 +7259,19 @@ Unpickler_clear(UnpicklerObject *self) } static void -Unpickler_dealloc(UnpicklerObject *self) +Unpickler_dealloc(PyObject *self) { PyTypeObject *tp = Py_TYPE(self); - PyObject_GC_UnTrack((PyObject *)self); + PyObject_GC_UnTrack(self); (void)Unpickler_clear(self); - tp->tp_free((PyObject *)self); + tp->tp_free(self); Py_DECREF(tp); } static int -Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg) +Unpickler_traverse(PyObject *op, visitproc visit, void *arg) { + UnpicklerObject *self = _UnpicklerObject_CAST(op); Py_VISIT(Py_TYPE(self)); Py_VISIT(self->readline); Py_VISIT(self->readinto); @@ -7328,7 +7331,7 @@ _pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file, { /* In case of multiple __init__() calls, clear previous content. */ if (self->read != NULL) - (void)Unpickler_clear(self); + (void)Unpickler_clear((PyObject *)self); if (_Unpickler_SetInputStream(self, file) < 0) return -1; @@ -7527,15 +7530,17 @@ UnpicklerMemoProxy_New(UnpicklerObject *unpickler) static PyObject * -Unpickler_get_memo(UnpicklerObject *self, void *Py_UNUSED(ignored)) +Unpickler_get_memo(PyObject *op, void *Py_UNUSED(ignored)) { + UnpicklerObject *self = _UnpicklerObject_CAST(op); return UnpicklerMemoProxy_New(self); } static int -Unpickler_set_memo(UnpicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored)) +Unpickler_set_memo(PyObject *op, PyObject *obj, void *Py_UNUSED(ignored)) { PyObject **new_memo; + UnpicklerObject *self = _UnpicklerObject_CAST(op); size_t new_memo_size = 0; if (obj == NULL) { @@ -7612,11 +7617,12 @@ Unpickler_set_memo(UnpicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored static PyObject * Unpickler_getattr(PyObject *self, PyObject *name) { + UnpicklerObject *obj = _UnpicklerObject_CAST(self); if (PyUnicode_Check(name) && PyUnicode_EqualToUTF8(name, "persistent_load") - && ((UnpicklerObject *)self)->persistent_load_attr) + && obj->persistent_load_attr) { - return Py_NewRef(((UnpicklerObject *)self)->persistent_load_attr); + return Py_NewRef(obj->persistent_load_attr); } return PyObject_GenericGetAttr(self, name); @@ -7628,8 +7634,9 @@ Unpickler_setattr(PyObject *self, PyObject *name, PyObject *value) if (PyUnicode_Check(name) && PyUnicode_EqualToUTF8(name, "persistent_load")) { + UnpicklerObject *obj = _UnpicklerObject_CAST(self); Py_XINCREF(value); - Py_XSETREF(((UnpicklerObject *)self)->persistent_load_attr, value); + Py_XSETREF(obj->persistent_load_attr, value); return 0; } @@ -7637,7 +7644,7 @@ Unpickler_setattr(PyObject *self, PyObject *name, PyObject *value) } static PyGetSetDef Unpickler_getsets[] = { - {"memo", (getter)Unpickler_get_memo, (setter)Unpickler_set_memo}, + {"memo", Unpickler_get_memo, Unpickler_set_memo}, {NULL} }; From 0b1d7266f62506fd8ab3ae9b5d4f9dd2146e4c6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Sat, 25 Jan 2025 15:31:20 +0100 Subject: [PATCH 4/8] fix UBSan failures for `PicklerMemoProxyObject` --- Modules/_pickle.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Modules/_pickle.c b/Modules/_pickle.c index 3d4af21dc25193..b429cf6ec81873 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -701,6 +701,7 @@ typedef struct { #define _PicklerObject_CAST(op) ((PicklerObject *)(op)) #define _UnpicklerObject_CAST(op) ((UnpicklerObject *)(op)) +#define _PicklerMemoProxyObject_CAST(op) ((PicklerMemoProxyObject *)(op)) /* Forward declarations */ static int save(PickleState *state, PicklerObject *, PyObject *, int); @@ -4980,27 +4981,29 @@ static PyMethodDef picklerproxy_methods[] = { }; static void -PicklerMemoProxy_dealloc(PicklerMemoProxyObject *self) +PicklerMemoProxy_dealloc(PyObject *op) { + PicklerMemoProxyObject *self = _PicklerMemoProxyObject_CAST(op); PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); Py_CLEAR(self->pickler); - tp->tp_free((PyObject *)self); + tp->tp_free(self); Py_DECREF(tp); } static int -PicklerMemoProxy_traverse(PicklerMemoProxyObject *self, - visitproc visit, void *arg) +PicklerMemoProxy_traverse(PyObject *op, visitproc visit, void *arg) { + PicklerMemoProxyObject *self = _PicklerMemoProxyObject_CAST(op); Py_VISIT(Py_TYPE(self)); Py_VISIT(self->pickler); return 0; } static int -PicklerMemoProxy_clear(PicklerMemoProxyObject *self) +PicklerMemoProxy_clear(PyObject *op) { + PicklerMemoProxyObject *self = _PicklerMemoProxyObject_CAST(op); Py_CLEAR(self->pickler); return 0; } From e3bcf30bbcfe91387fa4ab46c41d82b2c25f663b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Sat, 25 Jan 2025 15:32:55 +0100 Subject: [PATCH 5/8] fix UBSan failures for `UnpicklerMemoProxyObject` --- Modules/_pickle.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Modules/_pickle.c b/Modules/_pickle.c index b429cf6ec81873..af956cf77b6229 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -702,6 +702,7 @@ typedef struct { #define _PicklerObject_CAST(op) ((PicklerObject *)(op)) #define _UnpicklerObject_CAST(op) ((UnpicklerObject *)(op)) #define _PicklerMemoProxyObject_CAST(op) ((PicklerMemoProxyObject *)(op)) +#define _UnpicklerMemoProxyObject_CAST(op) ((UnpicklerMemoProxyObject *)(op)) /* Forward declarations */ static int save(PickleState *state, PicklerObject *, PyObject *, int); @@ -7473,27 +7474,29 @@ static PyMethodDef unpicklerproxy_methods[] = { }; static void -UnpicklerMemoProxy_dealloc(UnpicklerMemoProxyObject *self) +UnpicklerMemoProxy_dealloc(PyObject *op) { + UnpicklerMemoProxyObject *self = _UnpicklerMemoProxyObject_CAST(op); PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); Py_CLEAR(self->unpickler); - tp->tp_free((PyObject *)self); + tp->tp_free(self); Py_DECREF(tp); } static int -UnpicklerMemoProxy_traverse(UnpicklerMemoProxyObject *self, - visitproc visit, void *arg) +UnpicklerMemoProxy_traverse(PyObject *op, visitproc visit, void *arg) { + UnpicklerMemoProxyObject *self = _UnpicklerMemoProxyObject_CAST(op); Py_VISIT(Py_TYPE(self)); Py_VISIT(self->unpickler); return 0; } static int -UnpicklerMemoProxy_clear(UnpicklerMemoProxyObject *self) +UnpicklerMemoProxy_clear(PyObject *op) { + UnpicklerMemoProxyObject *self = _UnpicklerMemoProxyObject_CAST(op); Py_CLEAR(self->unpickler); return 0; } From fc28046a0ba35516d22b34b231ddbf328adec7e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Sat, 25 Jan 2025 15:35:27 +0100 Subject: [PATCH 6/8] indicate safe fast cast to avoid redundant future checks --- Modules/_pickle.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/_pickle.c b/Modules/_pickle.c index af956cf77b6229..6163fd541a8b33 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -5062,7 +5062,7 @@ Pickler_set_memo(PyObject *op, PyObject *obj, void *Py_UNUSED(ignored)) PickleState *st = _Pickle_FindStateByType(Py_TYPE(self)); if (Py_IS_TYPE(obj, st->PicklerMemoProxyType)) { - PicklerObject *pickler = + PicklerObject *pickler = /* safe fast cast for 'obj' */ ((PicklerMemoProxyObject *)obj)->pickler; new_memo = PyMemoTable_Copy(pickler->memo); @@ -7557,7 +7557,7 @@ Unpickler_set_memo(PyObject *op, PyObject *obj, void *Py_UNUSED(ignored)) PickleState *state = _Pickle_FindStateByType(Py_TYPE(self)); if (Py_IS_TYPE(obj, state->UnpicklerMemoProxyType)) { - UnpicklerObject *unpickler = + UnpicklerObject *unpickler = /* safe fast cast for 'obj' */ ((UnpicklerMemoProxyObject *)obj)->unpickler; new_memo_size = unpickler->memo_size; From d019c95f79c276e225f2050c0f068f070ac23cb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Thu, 6 Feb 2025 18:00:39 +0100 Subject: [PATCH 7/8] use semantically correct parameter names --- Modules/_pickle.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/_pickle.c b/Modules/_pickle.c index 6163fd541a8b33..b07a75055611b9 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -5042,14 +5042,14 @@ PicklerMemoProxy_New(PicklerObject *pickler) /*****************************************************************************/ static PyObject * -Pickler_get_memo(PyObject *op, void *Py_UNUSED(ignored)) +Pickler_get_memo(PyObject *op, void *Py_UNUSED(closure)) { PicklerObject *self = _PicklerObject_CAST(op); return PicklerMemoProxy_New(self); } static int -Pickler_set_memo(PyObject *op, PyObject *obj, void *Py_UNUSED(ignored)) +Pickler_set_memo(PyObject *op, PyObject *obj, void *Py_UNUSED(closure)) { PyMemoTable *new_memo = NULL; PicklerObject *self = _PicklerObject_CAST(op); @@ -7536,14 +7536,14 @@ UnpicklerMemoProxy_New(UnpicklerObject *unpickler) static PyObject * -Unpickler_get_memo(PyObject *op, void *Py_UNUSED(ignored)) +Unpickler_get_memo(PyObject *op, void *Py_UNUSED(closure)) { UnpicklerObject *self = _UnpicklerObject_CAST(op); return UnpicklerMemoProxy_New(self); } static int -Unpickler_set_memo(PyObject *op, PyObject *obj, void *Py_UNUSED(ignored)) +Unpickler_set_memo(PyObject *op, PyObject *obj, void *Py_UNUSED(closure)) { PyObject **new_memo; UnpicklerObject *self = _UnpicklerObject_CAST(op); From 2e4644761650df2646eaca33718720abcf2f55f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Sat, 8 Feb 2025 10:14:59 +0100 Subject: [PATCH 8/8] Do Do not use `_` + capital letter in new code as it is also UB. --- Modules/_pickle.c | 48 +++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/Modules/_pickle.c b/Modules/_pickle.c index 23982758e57688..74acd1977705dd 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -410,7 +410,7 @@ typedef struct { Py_ssize_t allocated; /* number of slots in data allocated */ } Pdata; -#define _Pdata_CAST(op) ((Pdata *)(op)) +#define Pdata_CAST(op) ((Pdata *)(op)) static int Pdata_traverse(PyObject *self, visitproc visit, void *arg) @@ -422,7 +422,7 @@ Pdata_traverse(PyObject *self, visitproc visit, void *arg) static void Pdata_dealloc(PyObject *op) { - Pdata *self = _Pdata_CAST(op); + Pdata *self = Pdata_CAST(op); PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); Py_ssize_t i = Py_SIZE(self); @@ -699,10 +699,10 @@ typedef struct { UnpicklerObject *unpickler; } UnpicklerMemoProxyObject; -#define _PicklerObject_CAST(op) ((PicklerObject *)(op)) -#define _UnpicklerObject_CAST(op) ((UnpicklerObject *)(op)) -#define _PicklerMemoProxyObject_CAST(op) ((PicklerMemoProxyObject *)(op)) -#define _UnpicklerMemoProxyObject_CAST(op) ((UnpicklerMemoProxyObject *)(op)) +#define PicklerObject_CAST(op) ((PicklerObject *)(op)) +#define UnpicklerObject_CAST(op) ((UnpicklerObject *)(op)) +#define PicklerMemoProxyObject_CAST(op) ((PicklerMemoProxyObject *)(op)) +#define UnpicklerMemoProxyObject_CAST(op) ((UnpicklerMemoProxyObject *)(op)) /* Forward declarations */ static int save(PickleState *state, PicklerObject *, PyObject *, int); @@ -4730,7 +4730,7 @@ static struct PyMethodDef Pickler_methods[] = { static int Pickler_clear(PyObject *op) { - PicklerObject *self = _PicklerObject_CAST(op); + PicklerObject *self = PicklerObject_CAST(op); Py_CLEAR(self->output_buffer); Py_CLEAR(self->write); Py_CLEAR(self->persistent_id); @@ -4760,7 +4760,7 @@ Pickler_dealloc(PyObject *self) static int Pickler_traverse(PyObject *op, visitproc visit, void *arg) { - PicklerObject *self = _PicklerObject_CAST(op); + PicklerObject *self = PicklerObject_CAST(op); Py_VISIT(Py_TYPE(self)); Py_VISIT(self->write); Py_VISIT(self->persistent_id); @@ -4984,7 +4984,7 @@ static PyMethodDef picklerproxy_methods[] = { static void PicklerMemoProxy_dealloc(PyObject *op) { - PicklerMemoProxyObject *self = _PicklerMemoProxyObject_CAST(op); + PicklerMemoProxyObject *self = PicklerMemoProxyObject_CAST(op); PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); Py_CLEAR(self->pickler); @@ -4995,7 +4995,7 @@ PicklerMemoProxy_dealloc(PyObject *op) static int PicklerMemoProxy_traverse(PyObject *op, visitproc visit, void *arg) { - PicklerMemoProxyObject *self = _PicklerMemoProxyObject_CAST(op); + PicklerMemoProxyObject *self = PicklerMemoProxyObject_CAST(op); Py_VISIT(Py_TYPE(self)); Py_VISIT(self->pickler); return 0; @@ -5004,7 +5004,7 @@ PicklerMemoProxy_traverse(PyObject *op, visitproc visit, void *arg) static int PicklerMemoProxy_clear(PyObject *op) { - PicklerMemoProxyObject *self = _PicklerMemoProxyObject_CAST(op); + PicklerMemoProxyObject *self = PicklerMemoProxyObject_CAST(op); Py_CLEAR(self->pickler); return 0; } @@ -5044,7 +5044,7 @@ PicklerMemoProxy_New(PicklerObject *pickler) static PyObject * Pickler_get_memo(PyObject *op, void *Py_UNUSED(closure)) { - PicklerObject *self = _PicklerObject_CAST(op); + PicklerObject *self = PicklerObject_CAST(op); return PicklerMemoProxy_New(self); } @@ -5052,7 +5052,7 @@ static int Pickler_set_memo(PyObject *op, PyObject *obj, void *Py_UNUSED(closure)) { PyMemoTable *new_memo = NULL; - PicklerObject *self = _PicklerObject_CAST(op); + PicklerObject *self = PicklerObject_CAST(op); if (obj == NULL) { PyErr_SetString(PyExc_TypeError, @@ -5115,7 +5115,7 @@ Pickler_set_memo(PyObject *op, PyObject *obj, void *Py_UNUSED(closure)) static PyObject * Pickler_getattr(PyObject *self, PyObject *name) { - PicklerObject *po = _PicklerObject_CAST(self); + PicklerObject *po = PicklerObject_CAST(self); if (PyUnicode_Check(name) && PyUnicode_EqualToUTF8(name, "persistent_id") && po->persistent_id_attr) @@ -5132,7 +5132,7 @@ Pickler_setattr(PyObject *self, PyObject *name, PyObject *value) if (PyUnicode_Check(name) && PyUnicode_EqualToUTF8(name, "persistent_id")) { - PicklerObject *po = _PicklerObject_CAST(self); + PicklerObject *po = PicklerObject_CAST(self); Py_XINCREF(value); Py_XSETREF(po->persistent_id_attr, value); return 0; @@ -7236,7 +7236,7 @@ static struct PyMethodDef Unpickler_methods[] = { static int Unpickler_clear(PyObject *op) { - UnpicklerObject *self = _UnpicklerObject_CAST(op); + UnpicklerObject *self = UnpicklerObject_CAST(op); Py_CLEAR(self->readline); Py_CLEAR(self->readinto); Py_CLEAR(self->read); @@ -7275,7 +7275,7 @@ Unpickler_dealloc(PyObject *self) static int Unpickler_traverse(PyObject *op, visitproc visit, void *arg) { - UnpicklerObject *self = _UnpicklerObject_CAST(op); + UnpicklerObject *self = UnpicklerObject_CAST(op); Py_VISIT(Py_TYPE(self)); Py_VISIT(self->readline); Py_VISIT(self->readinto); @@ -7476,7 +7476,7 @@ static PyMethodDef unpicklerproxy_methods[] = { static void UnpicklerMemoProxy_dealloc(PyObject *op) { - UnpicklerMemoProxyObject *self = _UnpicklerMemoProxyObject_CAST(op); + UnpicklerMemoProxyObject *self = UnpicklerMemoProxyObject_CAST(op); PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); Py_CLEAR(self->unpickler); @@ -7487,7 +7487,7 @@ UnpicklerMemoProxy_dealloc(PyObject *op) static int UnpicklerMemoProxy_traverse(PyObject *op, visitproc visit, void *arg) { - UnpicklerMemoProxyObject *self = _UnpicklerMemoProxyObject_CAST(op); + UnpicklerMemoProxyObject *self = UnpicklerMemoProxyObject_CAST(op); Py_VISIT(Py_TYPE(self)); Py_VISIT(self->unpickler); return 0; @@ -7496,7 +7496,7 @@ UnpicklerMemoProxy_traverse(PyObject *op, visitproc visit, void *arg) static int UnpicklerMemoProxy_clear(PyObject *op) { - UnpicklerMemoProxyObject *self = _UnpicklerMemoProxyObject_CAST(op); + UnpicklerMemoProxyObject *self = UnpicklerMemoProxyObject_CAST(op); Py_CLEAR(self->unpickler); return 0; } @@ -7538,7 +7538,7 @@ UnpicklerMemoProxy_New(UnpicklerObject *unpickler) static PyObject * Unpickler_get_memo(PyObject *op, void *Py_UNUSED(closure)) { - UnpicklerObject *self = _UnpicklerObject_CAST(op); + UnpicklerObject *self = UnpicklerObject_CAST(op); return UnpicklerMemoProxy_New(self); } @@ -7546,7 +7546,7 @@ static int Unpickler_set_memo(PyObject *op, PyObject *obj, void *Py_UNUSED(closure)) { PyObject **new_memo; - UnpicklerObject *self = _UnpicklerObject_CAST(op); + UnpicklerObject *self = UnpicklerObject_CAST(op); size_t new_memo_size = 0; if (obj == NULL) { @@ -7623,7 +7623,7 @@ Unpickler_set_memo(PyObject *op, PyObject *obj, void *Py_UNUSED(closure)) static PyObject * Unpickler_getattr(PyObject *self, PyObject *name) { - UnpicklerObject *obj = _UnpicklerObject_CAST(self); + UnpicklerObject *obj = UnpicklerObject_CAST(self); if (PyUnicode_Check(name) && PyUnicode_EqualToUTF8(name, "persistent_load") && obj->persistent_load_attr) @@ -7640,7 +7640,7 @@ Unpickler_setattr(PyObject *self, PyObject *name, PyObject *value) if (PyUnicode_Check(name) && PyUnicode_EqualToUTF8(name, "persistent_load")) { - UnpicklerObject *obj = _UnpicklerObject_CAST(self); + UnpicklerObject *obj = UnpicklerObject_CAST(self); Py_XINCREF(value); Py_XSETREF(obj->persistent_load_attr, value); return 0;