commit 3db05e761560c63215fc45a793aed2af45410455 Author: Jacek Konieczny <j.koniec...@eggsoft.pl> Date: Mon Oct 22 10:16:30 2018 +0200
Version: 0.11, some memleak fixes python-tdbus.spec | 11 ++-- reference_counting.patch | 140 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 146 insertions(+), 5 deletions(-) --- diff --git a/python-tdbus.spec b/python-tdbus.spec index d187857..ea26b31 100644 --- a/python-tdbus.spec +++ b/python-tdbus.spec @@ -7,13 +7,13 @@ %define module tdbus Summary: Simple ("trivial") Python bindings for D-BUS Name: python-%{module} -Version: 0.10 -Release: 2 +Version: 0.11 +Release: 1 License: MIT Group: Libraries/Python -Source0: https://github.com/hmvp/python-tdbus/archive/v0.10/%{name}-%{version}.tar.gz -# Source0-md5: 6033776d458aae287d2f9d92a801a42d -Patch0: use_after_free.patch +Source0: https://github.com/hmvp/python-tdbus/archive/v%{version}/%{name}-%{version}.tar.gz +# Source0-md5: 51eb65661eafcb56a10326187cd65355 +Patch0: reference_counting.patch URL: https://github.com/hmvp/python-tdbus BuildRequires: rpm-pythonprov BuildRequires: rpmbuild(macros) >= 1.710 @@ -87,6 +87,7 @@ Dokumentacja API %{module}. %prep %setup -q + %patch0 -p1 %build diff --git a/reference_counting.patch b/reference_counting.patch new file mode 100644 index 0000000..589ce97 --- /dev/null +++ b/reference_counting.patch @@ -0,0 +1,140 @@ +From 2de3d789e1c488ad730acabd3fc6f4968ac5e27b Mon Sep 17 00:00:00 2001 +From: Jacek Konieczny <jaj...@jajcus.net> +Date: Mon, 6 Aug 2018 13:19:51 +0200 +Subject: [PATCH] Release references received from PyObject_CallMethod() + +This reference leak usually won't hurt, as in most cases it is just +a reference to the same single Py_None object. The code was still +wrong, though. +--- + lib/tdbus/_tdbus.c | 24 ++++++++++++++++++------ + 1 file changed, 18 insertions(+), 6 deletions(-) + +diff --git a/lib/tdbus/_tdbus.c b/lib/tdbus/_tdbus.c +index 46ec3db..9cc094b 100644 +--- a/lib/tdbus/_tdbus.c ++++ b/lib/tdbus/_tdbus.c +@@ -1519,6 +1519,7 @@ static dbus_bool_t + _tdbus_add_watch_callback(DBusWatch *watch, void *data) + { + PyTDBusWatchObject *Pwatch; ++ PyObject *ret; + + if ((Pwatch = dbus_watch_get_data(watch)) == NULL) { + if ((Pwatch = PyObject_New(PyTDBusWatchObject, &PyTDBusWatchType)) == NULL) +@@ -1528,7 +1529,8 @@ _tdbus_add_watch_callback(DBusWatch *watch, void *data) + Py_INCREF(Pwatch); + dbus_watch_set_data(watch, Pwatch, _tdbus_decref); + } +- PyObject_CallMethod((PyObject *) data, "add_watch", "O", Pwatch); ++ ret = PyObject_CallMethod((PyObject *) data, "add_watch", "O", Pwatch); ++ Py_XDECREF(ret); + if (PyErr_Occurred()) + PyErr_Clear(); + return TRUE; +@@ -1538,10 +1540,12 @@ static void + _tdbus_remove_watch_callback(DBusWatch *watch, void *data) + { + PyObject *Pwatch; ++ PyObject *ret; + + Pwatch = dbus_watch_get_data(watch); + ASSERT(Pwatch != NULL); +- PyObject_CallMethod((PyObject *) data, "remove_watch", "O", Pwatch); ++ ret = PyObject_CallMethod((PyObject *) data, "remove_watch", "O", Pwatch); ++ Py_XDECREF(ret); + if (PyErr_Occurred()) + PyErr_Clear(); + error: +@@ -1552,10 +1556,12 @@ static void + _tdbus_watch_toggled_callback(DBusWatch *watch, void *data) + { + PyObject *Pwatch; ++ PyObject *ret; + + Pwatch = dbus_watch_get_data(watch); + ASSERT(Pwatch != NULL); +- PyObject_CallMethod((PyObject *) data, "watch_toggled", "O", Pwatch); ++ ret = PyObject_CallMethod((PyObject *) data, "watch_toggled", "O", Pwatch); ++ Py_XDECREF(ret); + if (PyErr_Occurred()) + PyErr_Clear(); + error: +@@ -1566,6 +1572,7 @@ static dbus_bool_t + _tdbus_add_timeout_callback(DBusTimeout *timeout, void *data) + { + PyTDBusTimeoutObject *Ptimeout; ++ PyObject *ret; + + if ((Ptimeout = dbus_timeout_get_data(timeout)) == NULL) { + if ((Ptimeout = PyObject_New(PyTDBusTimeoutObject, &PyTDBusTimeoutType)) == NULL) +@@ -1575,7 +1582,8 @@ _tdbus_add_timeout_callback(DBusTimeout *timeout, void *data) + Py_INCREF(Ptimeout); + dbus_timeout_set_data(timeout, Ptimeout, _tdbus_decref); + } +- PyObject_CallMethod((PyObject *) data, "add_timeout", "O", Ptimeout); ++ ret = PyObject_CallMethod((PyObject *) data, "add_timeout", "O", Ptimeout); ++ Py_XDECREF(ret); + if (PyErr_Occurred()) + PyErr_Clear(); + return TRUE; +@@ -1585,10 +1593,12 @@ static void + _tdbus_remove_timeout_callback(DBusTimeout *timeout, void *data) + { + PyObject *Ptimeout; ++ PyObject *ret; + + Ptimeout = dbus_timeout_get_data(timeout); + ASSERT(Ptimeout != NULL); +- PyObject_CallMethod((PyObject *) data, "remove_timeout", "O", Ptimeout); ++ ret = PyObject_CallMethod((PyObject *) data, "remove_timeout", "O", Ptimeout); ++ Py_XDECREF(ret); + if (PyErr_Occurred()) + PyErr_Clear(); + error: +@@ -1599,10 +1609,12 @@ static void + _tdbus_timeout_toggled_callback(DBusTimeout *timeout, void *data) + { + PyObject *Ptimeout; ++ PyObject *ret; + + Ptimeout = dbus_timeout_get_data(timeout); + ASSERT(Ptimeout != NULL); +- PyObject_CallMethod((PyObject *) data, "timeout_toggled", "O", Ptimeout); ++ ret = PyObject_CallMethod((PyObject *) data, "timeout_toggled", "O", Ptimeout); ++ Py_XDECREF(ret); + if (PyErr_Occurred()) + PyErr_Clear(); + error: +From 3061ba1347f752cae375fb7ac4658d8facabd0a4 Mon Sep 17 00:00:00 2001 +From: Jacek Konieczny <jaj...@jajcus.net> +Date: Mon, 6 Aug 2018 13:22:51 +0200 +Subject: [PATCH] Don't add unnecessary references in add_*_callback + +PyObject_New() gives us existing reference to TDBusWatch and TDBusTimeout objects, +which we pass to the DBusWatch and DBusTimeout objects. Calling +Py_INCREF() of those only creates a memory leak. +--- + lib/tdbus/_tdbus.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/lib/tdbus/_tdbus.c b/lib/tdbus/_tdbus.c +index 9cc094b..d3de475 100644 +--- a/lib/tdbus/_tdbus.c ++++ b/lib/tdbus/_tdbus.c +@@ -1526,7 +1526,6 @@ _tdbus_add_watch_callback(DBusWatch *watch, void *data) + return FALSE; + Pwatch->watch = watch; + Pwatch->data = NULL; +- Py_INCREF(Pwatch); + dbus_watch_set_data(watch, Pwatch, _tdbus_decref); + } + ret = PyObject_CallMethod((PyObject *) data, "add_watch", "O", Pwatch); +@@ -1579,7 +1578,6 @@ _tdbus_add_timeout_callback(DBusTimeout *timeout, void *data) + return FALSE; + Ptimeout->timeout = timeout; + Ptimeout->data = NULL; +- Py_INCREF(Ptimeout); + dbus_timeout_set_data(timeout, Ptimeout, _tdbus_decref); + } + ret = PyObject_CallMethod((PyObject *) data, "add_timeout", "O", Ptimeout); ================================================================ ---- gitweb: http://git.pld-linux.org/gitweb.cgi/packages/python-tdbus.git/commitdiff/3db05e761560c63215fc45a793aed2af45410455 _______________________________________________ pld-cvs-commit mailing list pld-cvs-commit@lists.pld-linux.org http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit