This change is to ensure objects from the ipaddress module are cleaned up when spoa module initialization fails. In general the interpreter would just crash, but in a code where import is conditional (try/except), then we would keep those objects around --- contrib/spoa_server/ps_python.c | 6 ++++++ 1 file changed, 6 insertions(+)
diff --git a/contrib/spoa_server/ps_python.c b/contrib/spoa_server/ps_python.c index 12953f3..f2ddc16 100644 --- a/contrib/spoa_server/ps_python.c +++ b/contrib/spoa_server/ps_python.c @@ -410,18 +410,24 @@ static int ps_python_start_worker(struct worker *w) ipv4_address = PyObject_GetAttrString(module_ipaddress, "IPv4Address"); if (ipv4_address == NULL) { + Py_DECREF(module_ipaddress); PyErr_Print(); return 0; } ipv6_address = PyObject_GetAttrString(module_ipaddress, "IPv6Address"); if (ipv6_address == NULL) { + Py_DECREF(ipv4_address); + Py_DECREF(module_ipaddress); PyErr_Print(); return 0; } PY_INIT_MODULE(m, "spoa", spoa_methods, &spoa_module_definition); if (m == NULL) { + Py_DECREF(ipv4_address); + Py_DECREF(ipv6_address); + Py_DECREF(module_ipaddress); PyErr_Print(); return 0; } -- 2.23.3