add proper error handling to loaded_modules()
authorAndy Grover <andy@groveronline.com>
Mon, 19 Mar 2012 04:49:07 +0000 (21:49 -0700)
committerAndy Grover <andy@groveronline.com>
Mon, 19 Mar 2012 04:54:03 +0000 (21:54 -0700)
We need to check the result of basically all Py* calls and cleanup
properly if they fail.

Signed-off-by: Andy Grover <andy@groveronline.com>
libkmod.c

index b36133511dad85460b71c524934c38c0822fa56a..dd82d9e654071343308816a9ffbe1c7cd1273a54 100644 (file)
--- a/libkmod.c
+++ b/libkmod.c
@@ -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);