summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Grover <andy@groveronline.com>2012-03-18 21:49:07 -0700
committerLucas De Marchi <lucas.demarchi@intel.com>2014-03-20 07:22:52 -0300
commit9b39ce0308826df353cae0ddaf9fb820db940ed0 (patch)
treee7e4e28bddf312730cbbf62b639583065e7d3fcf
parent8b740787d208511f4e6a886028d310fa29a23cd0 (diff)
downloadkmod-9b39ce0308826df353cae0ddaf9fb820db940ed0.tar.gz
python: add proper error handling to loaded_modules()
We need to check the result of basically all Py* calls and cleanup properly if they fail.
-rw-r--r--libkmod/python/libkmod.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/libkmod/python/libkmod.c b/libkmod/python/libkmod.c
index b361335..dd82d9e 100644
--- a/libkmod/python/libkmod.c
+++ b/libkmod/python/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);