]> xenbits.xensource.com Git - libvirt.git/commitdiff
python: Avoid memory leaks on libvirt_virNodeGetCPUStats
authorAlex Jia <ajia@redhat.com>
Wed, 21 Mar 2012 16:25:22 +0000 (00:25 +0800)
committerAlex Jia <ajia@redhat.com>
Thu, 22 Mar 2012 02:19:13 +0000 (10:19 +0800)
Detected by valgrind. Leaks are introduced in commit 4955602.

* python/libvirt-override.c (libvirt_virNodeGetCPUStats): fix memory leaks
and improve codes return value.

For details, please see the following link:
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=770943

Signed-off-by: Alex Jia <ajia@redhat.com>
python/libvirt-override.c

index 8ed9f73a098f9b4dbe76a3fc804d891eb59c5872..22ee975deaa0f449902d4fb136811f79898da6d2 100644 (file)
@@ -2503,7 +2503,9 @@ libvirt_virNodeGetCellsFreeMemory(PyObject *self ATTRIBUTE_UNUSED, PyObject *arg
 static PyObject *
 libvirt_virNodeGetCPUStats(PyObject *self ATTRIBUTE_UNUSED, PyObject *args)
 {
-    PyObject *ret;
+    PyObject *ret = NULL;
+    PyObject *key = NULL;
+    PyObject *val = NULL;
     PyObject *pyobj_conn;
     virConnectPtr conn;
     unsigned int flags;
@@ -2512,7 +2514,7 @@ libvirt_virNodeGetCPUStats(PyObject *self ATTRIBUTE_UNUSED, PyObject *args)
     virNodeCPUStatsPtr stats = NULL;
 
     if (!PyArg_ParseTuple(args, (char *)"Oii:virNodeGetCPUStats", &pyobj_conn, &cpuNum, &flags))
-        return(NULL);
+        return ret;
     conn = (virConnectPtr)(PyvirConnect_Get(pyobj_conn));
 
     LIBVIRT_BEGIN_ALLOW_THREADS;
@@ -2523,7 +2525,7 @@ libvirt_virNodeGetCPUStats(PyObject *self ATTRIBUTE_UNUSED, PyObject *args)
 
     if (nparams) {
         if (VIR_ALLOC_N(stats, nparams) < 0)
-            return VIR_PY_NONE;
+            return PyErr_NoMemory();
 
         LIBVIRT_BEGIN_ALLOW_THREADS;
         c_retval = virNodeGetCPUStats(conn, cpuNum, stats, &nparams, flags);
@@ -2533,18 +2535,32 @@ libvirt_virNodeGetCPUStats(PyObject *self ATTRIBUTE_UNUSED, PyObject *args)
             return VIR_PY_NONE;
         }
     }
-    if (!(ret = PyDict_New())) {
-        VIR_FREE(stats);
-        return VIR_PY_NONE;
-    }
+
+    if (!(ret = PyDict_New()))
+        goto error;
+
     for (i = 0; i < nparams; i++) {
-        PyDict_SetItem(ret,
-                       libvirt_constcharPtrWrap(stats[i].field),
-                       libvirt_ulonglongWrap(stats[i].value));
+        key = libvirt_constcharPtrWrap(stats[i].field);
+        val = libvirt_ulonglongWrap(stats[i].value);
+
+        if (!key || !val || PyDict_SetItem(ret, key, val) < 0) {
+            Py_DECREF(ret);
+            ret = NULL;
+            goto error;
+        }
+
+        Py_DECREF(key);
+        Py_DECREF(val);
     }
 
     VIR_FREE(stats);
     return ret;
+
+error:
+    VIR_FREE(stats);
+    Py_XDECREF(key);
+    Py_XDECREF(val);
+    return ret;
 }
 
 static PyObject *