From 9ab460c9009804b31e24ea7688fe0065a1dff9ae Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 29 Jun 2022 15:13:57 +0200 Subject: [PATCH] event: Fix memory leak in debug check of `task.set_owner(...)` Fixes #1328 --- panda/src/event/pythonTask.cxx | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/panda/src/event/pythonTask.cxx b/panda/src/event/pythonTask.cxx index 07fca8bd38..f214ee73d6 100644 --- a/panda/src/event/pythonTask.cxx +++ b/panda/src/event/pythonTask.cxx @@ -209,10 +209,22 @@ set_owner(PyObject *owner) { #ifndef NDEBUG if (owner != Py_None) { PyObject *add = PyObject_GetAttrString(owner, "_addTask"); + PyErr_Clear(); PyObject *clear = PyObject_GetAttrString(owner, "_clearTask"); + PyErr_Clear(); - if (add == nullptr || !PyCallable_Check(add) || - clear == nullptr || !PyCallable_Check(clear)) { + bool valid_add = false; + if (add != nullptr) { + valid_add = PyCallable_Check(add); + Py_DECREF(add); + } + bool valid_clear = false; + if (clear != nullptr) { + valid_clear = PyCallable_Check(clear); + Py_DECREF(clear); + } + + if (!valid_add || !valid_clear) { Dtool_Raise_TypeError("owner object should have _addTask and _clearTask methods"); return; }