From ca10fd19a0eeccd21f6bdad4648396a2567f351d 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, 20 Mar 2025 16:54:55 +0100 Subject: [PATCH 1/3] fix UBSan failures for `_testcapi/buffer.c` --- Modules/_testcapi/buffer.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/Modules/_testcapi/buffer.c b/Modules/_testcapi/buffer.c index 7e2f6e5e29482c..1ea820f0d17a5c 100644 --- a/Modules/_testcapi/buffer.c +++ b/Modules/_testcapi/buffer.c @@ -11,6 +11,8 @@ typedef struct { Py_ssize_t references; } testBufObject; +#define testBufObject_CAST(op) ((testBufObject *)(op)) + static PyObject * testbuf_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { @@ -29,30 +31,34 @@ testbuf_new(PyTypeObject *type, PyObject *args, PyObject *kwds) } static int -testbuf_traverse(testBufObject *self, visitproc visit, void *arg) +testbuf_traverse(PyObject *op, visitproc visit, void *arg) { + testBufObject *self = testBufObject_CAST(op); Py_VISIT(self->obj); return 0; } static int -testbuf_clear(testBufObject *self) +testbuf_clear(PyObject *op) { + testBufObject *self = testBufObject_CAST(op); Py_CLEAR(self->obj); return 0; } static void -testbuf_dealloc(testBufObject *self) +testbuf_dealloc(PyObject *op) { + testBufObject *self = testBufObject_CAST(op); PyObject_GC_UnTrack(self); Py_XDECREF(self->obj); - Py_TYPE(self)->tp_free((PyObject *) self); + Py_TYPE(self)->tp_free(self); } static int -testbuf_getbuf(testBufObject *self, Py_buffer *view, int flags) +testbuf_getbuf(PyObject *op, Py_buffer *view, int flags) { + testBufObject *self = testBufObject_CAST(op); int buf = PyObject_GetBuffer(self->obj, view, flags); if (buf == 0) { Py_SETREF(view->obj, Py_NewRef(self)); @@ -62,15 +68,16 @@ testbuf_getbuf(testBufObject *self, Py_buffer *view, int flags) } static void -testbuf_releasebuf(testBufObject *self, Py_buffer *view) +testbuf_releasebuf(PyObject *self, Py_buffer *Py_UNUSED(view)) { + testBufObject *self = testBufObject_CAST(op); self->references--; assert(self->references >= 0); } static PyBufferProcs testbuf_as_buffer = { - .bf_getbuffer = (getbufferproc) testbuf_getbuf, - .bf_releasebuffer = (releasebufferproc) testbuf_releasebuf, + .bf_getbuffer = testbuf_getbuf, + .bf_releasebuffer = testbuf_releasebuf, }; static struct PyMemberDef testbuf_members[] = { @@ -84,9 +91,9 @@ static PyTypeObject testBufType = { .tp_basicsize = sizeof(testBufObject), .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, .tp_new = testbuf_new, - .tp_dealloc = (destructor) testbuf_dealloc, - .tp_traverse = (traverseproc) testbuf_traverse, - .tp_clear = (inquiry) testbuf_clear, + .tp_dealloc = testbuf_dealloc, + .tp_traverse = testbuf_traverse, + .tp_clear = testbuf_clear, .tp_as_buffer = &testbuf_as_buffer, .tp_members = testbuf_members }; From 4ca80b568b782ca15f2c761c0a1c68825a203bdd 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, 20 Mar 2025 16:56:12 +0100 Subject: [PATCH 2/3] fix UBSan failures for `_testcapi/monitoring.c` --- Modules/_testcapi/monitoring.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Modules/_testcapi/monitoring.c b/Modules/_testcapi/monitoring.c index e475e3b5937199..08a2055c51bc0d 100644 --- a/Modules/_testcapi/monitoring.c +++ b/Modules/_testcapi/monitoring.c @@ -14,6 +14,7 @@ typedef struct { /* Other fields */ } PyCodeLikeObject; +#define PyCodeLikeObject_CAST(op) ((PyCodeLikeObject *)(op)) static PyObject * CodeLike_new(PyTypeObject *type, PyObject *args, PyObject *kwds) @@ -40,8 +41,9 @@ CodeLike_new(PyTypeObject *type, PyObject *args, PyObject *kwds) } static void -CodeLike_dealloc(PyCodeLikeObject *self) +CodeLike_dealloc(PyObject *op) { + PyCodeLikeObject *self = PyCodeLikeObject_CAST(op); if (self->monitoring_states) { PyMem_Free(self->monitoring_states); } @@ -49,8 +51,9 @@ CodeLike_dealloc(PyCodeLikeObject *self) } static PyObject * -CodeLike_str(PyCodeLikeObject *self) +CodeLike_str(PyObject *op) { + PyCodeLikeObject *self = PyCodeLikeObject_CAST(op); PyObject *res = NULL; PyObject *sep = NULL; PyObject *parts = NULL; @@ -101,8 +104,8 @@ static PyTypeObject PyCodeLike_Type = { .tp_itemsize = 0, .tp_flags = Py_TPFLAGS_DEFAULT, .tp_new = CodeLike_new, - .tp_dealloc = (destructor) CodeLike_dealloc, - .tp_str = (reprfunc) CodeLike_str, + .tp_dealloc = CodeLike_dealloc, + .tp_str = CodeLike_str, }; #define RAISE_UNLESS_CODELIKE(v) if (!Py_IS_TYPE((v), &PyCodeLike_Type)) { \ From eb9563ef21f125901dfefae1e746f592637d7271 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, 20 Mar 2025 17:43:18 +0100 Subject: [PATCH 3/3] fixup --- Modules/_testcapi/buffer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_testcapi/buffer.c b/Modules/_testcapi/buffer.c index 1ea820f0d17a5c..e63d4179824529 100644 --- a/Modules/_testcapi/buffer.c +++ b/Modules/_testcapi/buffer.c @@ -68,7 +68,7 @@ testbuf_getbuf(PyObject *op, Py_buffer *view, int flags) } static void -testbuf_releasebuf(PyObject *self, Py_buffer *Py_UNUSED(view)) +testbuf_releasebuf(PyObject *op, Py_buffer *Py_UNUSED(view)) { testBufObject *self = testBufObject_CAST(op); self->references--;