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


Reply via email to