From: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> Date: Fri, 21 Feb 2025 14:37:32 +0000 (+0100) Subject: gh-111178: fix UBSan failures in `Modules/_queuemodule.c` (GH-129790) X-Git-Tag: v3.14.0a6~323 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=55f8bac208540f9950080d89284a34ab4ba3926e;p=thirdparty%2FPython%2Fcpython.git gh-111178: fix UBSan failures in `Modules/_queuemodule.c` (GH-129790) Fix UBSan failures for `simplequeueobject` Suppress unused return values --- diff --git a/Modules/_queuemodule.c b/Modules/_queuemodule.c index aee8db802d8c..4233ac5736c6 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)); @@ -514,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"