]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-111178: fix UBSan failures in `Modules/_queuemodule.c` (GH-129790)
authorBénédikt Tran <10796600+picnixz@users.noreply.github.com>
Fri, 21 Feb 2025 14:37:32 +0000 (15:37 +0100)
committerGitHub <noreply@github.com>
Fri, 21 Feb 2025 14:37:32 +0000 (14:37 +0000)
Fix UBSan failures for `simplequeueobject`

Suppress unused return values

Modules/_queuemodule.c

index aee8db802d8c3f57bb5b290d223b1099ce426603..4233ac5736c61e4fba37bb564ac4ebea1a8eccce 100644 (file)
@@ -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"