From 1286c38e1c79d69fdd6bae79132a1400025dcc7f 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:39:02 +0100 Subject: [PATCH 1/3] fix UBSan failures for `simplequeueobject` --- Modules/_queuemodule.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/Modules/_queuemodule.c b/Modules/_queuemodule.c index aee8db802d8c3f..6c75824998ee9a 100644 --- a/Modules/_queuemodule.c +++ b/Modules/_queuemodule.c @@ -197,6 +197,8 @@ typedef struct { PyObject *weakreflist; } simplequeueobject; +#define _simplequeueobject_CAST(op) ((simplequeueobject *)(op)) + /*[clinic input] module _queue class _queue.SimpleQueue "simplequeueobject *" "simplequeue_get_state_by_type(type)->SimpleQueueType" @@ -204,28 +206,32 @@ class _queue.SimpleQueue "simplequeueobject *" "simplequeue_get_state_by_type(ty /*[clinic end generated code: output=da39a3ee5e6b4b0d input=0a4023fe4d198c8d]*/ static int -simplequeue_clear(simplequeueobject *self) +simplequeue_clear(PyObject *op) { + simplequeueobject *self = _simplequeueobject_CAST(op); RingBuf_Fini(&self->buf); return 0; } static void -simplequeue_dealloc(simplequeueobject *self) +simplequeue_dealloc(PyObject *op) { + simplequeueobject *self = _simplequeueobject_CAST(op); PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); - (void)simplequeue_clear(self); - if (self->weakreflist != NULL) - PyObject_ClearWeakRefs((PyObject *) self); - Py_TYPE(self)->tp_free(self); + (void)simplequeue_clear(op); + if (self->weakreflist != NULL) { + PyObject_ClearWeakRefs(op); + } + tp->tp_free(self); Py_DECREF(tp); } static int -simplequeue_traverse(simplequeueobject *self, visitproc visit, void *arg) +simplequeue_traverse(PyObject *op, visitproc visit, void *arg) { + simplequeueobject *self = _simplequeueobject_CAST(op); RingBuf *buf = &self->buf; for (Py_ssize_t i = 0, num_items = buf->num_items; i < num_items; i++) { Py_VISIT(RingBuf_At(buf, i)); From 04bcc57cfc5163f1165cff67f06467cdd90badb9 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:39:13 +0100 Subject: [PATCH 2/3] suppress unused return values --- Modules/_queuemodule.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_queuemodule.c b/Modules/_queuemodule.c index 6c75824998ee9a..755b80d9082872 100644 --- a/Modules/_queuemodule.c +++ b/Modules/_queuemodule.c @@ -520,7 +520,7 @@ queue_clear(PyObject *m) static void queue_free(void *m) { - queue_clear((PyObject *)m); + (void)queue_clear((PyObject *)m); } #include "clinic/_queuemodule.c.h" From 45a1c8787fc7a6d0d876b9ab706b2333582333af 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:29:53 +0100 Subject: [PATCH 3/3] Do not add an underscore to the macro if none is needed. --- Modules/_queuemodule.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/_queuemodule.c b/Modules/_queuemodule.c index 755b80d9082872..4233ac5736c61e 100644 --- a/Modules/_queuemodule.c +++ b/Modules/_queuemodule.c @@ -197,7 +197,7 @@ typedef struct { PyObject *weakreflist; } simplequeueobject; -#define _simplequeueobject_CAST(op) ((simplequeueobject *)(op)) +#define simplequeueobject_CAST(op) ((simplequeueobject *)(op)) /*[clinic input] module _queue @@ -208,7 +208,7 @@ class _queue.SimpleQueue "simplequeueobject *" "simplequeue_get_state_by_type(ty static int simplequeue_clear(PyObject *op) { - simplequeueobject *self = _simplequeueobject_CAST(op); + simplequeueobject *self = simplequeueobject_CAST(op); RingBuf_Fini(&self->buf); return 0; } @@ -216,7 +216,7 @@ simplequeue_clear(PyObject *op) static void simplequeue_dealloc(PyObject *op) { - simplequeueobject *self = _simplequeueobject_CAST(op); + simplequeueobject *self = simplequeueobject_CAST(op); PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); @@ -231,7 +231,7 @@ simplequeue_dealloc(PyObject *op) static int simplequeue_traverse(PyObject *op, visitproc visit, void *arg) { - simplequeueobject *self = _simplequeueobject_CAST(op); + simplequeueobject *self = simplequeueobject_CAST(op); RingBuf *buf = &self->buf; for (Py_ssize_t i = 0, num_items = buf->num_items; i < num_items; i++) { Py_VISIT(RingBuf_At(buf, i));