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