]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-111178: fix UBSan failures in `Modules/_lsprof.c` (GH-129782)
authorBénédikt Tran <10796600+picnixz@users.noreply.github.com>
Mon, 17 Feb 2025 13:53:03 +0000 (14:53 +0100)
committerGitHub <noreply@github.com>
Mon, 17 Feb 2025 13:53:03 +0000 (14:53 +0100)
Fix UBSan failures for `ProfilerObject`

Suppress unused return value

Modules/_lsprof.c

index eab26b39be14ef498eadb509f7b8b9ae93a1ad0d..39d900cb824312400437cddef7c9fc8e4b37e2a5 100644 (file)
@@ -56,6 +56,8 @@ typedef struct {
     PyObject* missing;
 } ProfilerObject;
 
+#define ProfilerObject_CAST(op) ((ProfilerObject *)(op))
+
 #define POF_ENABLED     0x001
 #define POF_SUBCALLS    0x002
 #define POF_BUILTINS    0x004
@@ -921,18 +923,20 @@ _lsprof_Profiler_clear_impl(ProfilerObject *self)
 }
 
 static int
-profiler_traverse(ProfilerObject *op, visitproc visit, void *arg)
+profiler_traverse(PyObject *op, visitproc visit, void *arg)
 {
+    ProfilerObject *self = ProfilerObject_CAST(op);
     Py_VISIT(Py_TYPE(op));
-    Py_VISIT(op->externalTimer);
+    Py_VISIT(self->externalTimer);
     return 0;
 }
 
 static void
-profiler_dealloc(ProfilerObject *op)
+profiler_dealloc(PyObject *op)
 {
-    PyObject_GC_UnTrack(op);
-    if (op->flags & POF_ENABLED) {
+    ProfilerObject *self = ProfilerObject_CAST(op);
+    PyObject_GC_UnTrack(self);
+    if (self->flags & POF_ENABLED) {
         PyThreadState *tstate = _PyThreadState_GET();
         if (_PyEval_SetProfile(tstate, NULL, NULL) < 0) {
             PyErr_FormatUnraisable("Exception ignored while "
@@ -940,11 +944,11 @@ profiler_dealloc(ProfilerObject *op)
         }
     }
 
-    flush_unmatched(op);
-    clearEntries(op);
-    Py_XDECREF(op->externalTimer);
-    PyTypeObject *tp = Py_TYPE(op);
-    tp->tp_free(op);
+    flush_unmatched(self);
+    clearEntries(self);
+    Py_XDECREF(self->externalTimer);
+    PyTypeObject *tp = Py_TYPE(self);
+    tp->tp_free(self);
     Py_DECREF(tp);
 }
 
@@ -1045,7 +1049,7 @@ _lsprof_clear(PyObject *module)
 static void
 _lsprof_free(void *module)
 {
-    _lsprof_clear((PyObject *)module);
+    (void)_lsprof_clear((PyObject *)module);
 }
 
 static int