python: add proper error handling to loaded_modules()
authorAndy Grover <andy@groveronline.com>
Mon, 19 Mar 2012 04:49:07 +0000 (21:49 -0700)
committerLucas De Marchi <lucas.demarchi@intel.com>
Tue, 25 Mar 2014 03:34:14 +0000 (00:34 -0300)
We need to check the result of basically all Py* calls and cleanup
properly if they fail.

libkmod/python/libkmod.c

index b361335..dd82d9e 100644 (file)
@@ -97,15 +97,32 @@ kmod_obj_loaded_modules(PyObject *self, PyObject *unused_args)
     }
 
     PyObject *pylist = PyList_New(0);
+    if (!pylist) {
+        kmod_module_unref_list(list);
+        return PyErr_NoMemory();
+    }
 
+    /* refcountapallooza. */
     kmod_list_foreach(itr, list) {
         struct kmod_module *mod = kmod_module_get_module(itr);
         const char *name = kmod_module_get_name(mod);
         long size = kmod_module_get_size(mod);
 
        PyObject *entry = Py_BuildValue("(sl)", name, size);
-
-       PyList_Append(pylist, entry);
+       if (!entry) {
+            Py_DECREF(pylist);
+            kmod_module_unref(mod);
+            kmod_module_unref_list(list);
+            return NULL;
+        }
+
+       if (PyList_Append(pylist, entry) == -1) {
+            Py_DECREF(entry);
+            Py_DECREF(pylist);
+            kmod_module_unref(mod);
+            kmod_module_unref_list(list);
+            return NULL;
+        }
 
        Py_DECREF(entry);
         kmod_module_unref(mod);