From 132d8f61e9440b9254069ca2c4bcff67df29bb6f Mon Sep 17 00:00:00 2001 From: Gilchrist Dadaglo Date: Tue, 8 Dec 2020 14:37:11 +0000 Subject: [PATCH] BUG/MINOR: spoa/python: Cleanup references for failed Module Addobject operations As per https://docs.python.org/3/c-api/module.html#c.PyModule_AddObject, references are stolen by the function only for success. We must do cleanup manually if there is a failure This patch must be backported as far as 2.0. --- contrib/spoa_server/ps_python.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/contrib/spoa_server/ps_python.c b/contrib/spoa_server/ps_python.c index fbaa4147fb..12953f3804 100644 --- a/contrib/spoa_server/ps_python.c +++ b/contrib/spoa_server/ps_python.c @@ -427,8 +427,19 @@ static int ps_python_start_worker(struct worker *w) } spoa_error = PyErr_NewException("spoa.error", NULL, NULL); + /* PyModule_AddObject will steal the reference to spoa_error + * in case of success only + * We need to increment the counters to continue using it + * but cleanup in case of failure + */ Py_INCREF(spoa_error); - PyModule_AddObject(m, "error", spoa_error); + ret = PyModule_AddObject(m, "error", spoa_error); + if (ret == -1) { + Py_DECREF(m); + Py_DECREF(spoa_error); + PyErr_Print(); + return 0; + } value = PyLong_FromLong(SPOE_SCOPE_PROC); @@ -439,54 +450,68 @@ static int ps_python_start_worker(struct worker *w) ret = PyModule_AddObject(m, "scope_proc", value); if (ret == -1) { + Py_DECREF(m); + Py_DECREF(value); PyErr_Print(); return 0; } value = PyLong_FromLong(SPOE_SCOPE_SESS); if (value == NULL) { + Py_DECREF(m); PyErr_Print(); return 0; } ret = PyModule_AddObject(m, "scope_sess", value); if (ret == -1) { + Py_DECREF(m); + Py_DECREF(value); PyErr_Print(); return 0; } value = PyLong_FromLong(SPOE_SCOPE_TXN); if (value == NULL) { + Py_DECREF(m); PyErr_Print(); return 0; } ret = PyModule_AddObject(m, "scope_txn", value); if (ret == -1) { + Py_DECREF(m); + Py_DECREF(value); PyErr_Print(); return 0; } value = PyLong_FromLong(SPOE_SCOPE_REQ); if (value == NULL) { + Py_DECREF(m); PyErr_Print(); return 0; } ret = PyModule_AddObject(m, "scope_req", value); if (ret == -1) { + Py_DECREF(m); + Py_DECREF(value); PyErr_Print(); return 0; } value = PyLong_FromLong(SPOE_SCOPE_RES); if (value == NULL) { + Py_DECREF(m); PyErr_Print(); return 0; } ret = PyModule_AddObject(m, "scope_res", value); if (ret == -1) { + Py_DECREF(m); + Py_DECREF(value); PyErr_Print(); return 0; } -- 2.47.3