[libvirt] [python PATCHv2 1/2] event: fix domain reference bugs

Eric Blake eblake at redhat.com
Mon Mar 24 19:14:23 UTC 2014


Noticed this bug while adding qemu monitor events; there's probably
lots of other misuse of libvirt_virDomainPtrWrap, but for now I'm
limiting the fix to all copied-and-pasted event callbacks, since
I'm about to copy it again in the next patch.  While at it, check
for failure to extract the "conn" key from the opaque callback
struct, and hoist that check to occur before we reach the point
where it is harder to undo on failure (the network code was the
only code that had it in the right place, but then it failed to
restore thread state on failure).

The graphics callback is still not clean; but incremental
improvements are better than nothing.

* libvirt-override.c (libvirt_virConnectDomainEventCallback)
(libvirt_virConnectDomainEvetnLifecycleCallback)
(libvirt_virConnectDomainEventGenericCallback)
(libvirt_virConnectDomainEventRTCChangeCallback)
(libvirt_virConnectDomainEventWatchdogCallback)
(libvirt_virConnectDomainEventIOErrorCallback)
(libvirt_virConnectDomainEventIOErrorReasonCallback)
(libvirt_virConnectDomainEventGraphicsCallback)
(libvirt_virConnectDomainEventBlockJobCallback)
(libvirt_virConnectDomainEventDiskChangeCallback)
(libvirt_virConnectDomainEventTrayChangeCallback)
(libvirt_virConnectDomainEventPMWakeupCallback)
(libvirt_virConnectDomainEventPMSuspendCallback)
(libvirt_virConnectDomainEventBalloonChangeCallback)
(libvirt_virConnectDomainEventPMSuspendDiskCallback)
(libvirt_virConnectDomainEventDeviceRemovedCallback): Don't pass
NULL to PyObject_CallMethod.
(libvirt_virConnectNetworkEventLifecycleCallback): Likewise, and
don't corrupt thread state.

Signed-off-by: Eric Blake <eblake at redhat.com>
---
 libvirt-override.c | 319 +++++++++++++++++++++++++++++++++--------------------
 1 file changed, 200 insertions(+), 119 deletions(-)

diff --git a/libvirt-override.c b/libvirt-override.c
index 6a85d24..9dc6ad4 100644
--- a/libvirt-override.c
+++ b/libvirt-override.c
@@ -5020,7 +5020,7 @@ libvirt_virConnectDomainEventCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
                                       int detail,
                                       void *opaque)
 {
-    PyObject *pyobj_ret;
+    PyObject *pyobj_ret = NULL;

     PyObject *pyobj_conn = (PyObject*)opaque;
     PyObject *pyobj_dom;
@@ -5031,7 +5031,10 @@ libvirt_virConnectDomainEventCallback(virConnectPtr conn ATTRIBUTE_UNUSED,

     /* Create a python instance of this virDomainPtr */
     virDomainRef(dom);
-    pyobj_dom = libvirt_virDomainPtrWrap(dom);
+    if (!(pyobj_dom = libvirt_virDomainPtrWrap(dom))) {
+        virDomainFree(dom);
+        goto cleanup;
+    }

     /* Call the Callback Dispatcher */
     pyobj_ret = PyObject_CallMethod(pyobj_conn,
@@ -5042,6 +5045,7 @@ libvirt_virConnectDomainEventCallback(virConnectPtr conn ATTRIBUTE_UNUSED,

     Py_DECREF(pyobj_dom);

+ cleanup:
     if (!pyobj_ret) {
         DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
         PyErr_Print();
@@ -5055,8 +5059,8 @@ libvirt_virConnectDomainEventCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
 }

 static PyObject *
-libvirt_virConnectDomainEventRegister(ATTRIBUTE_UNUSED PyObject * self,
-                                      PyObject * args)
+libvirt_virConnectDomainEventRegister(ATTRIBUTE_UNUSED PyObject *self,
+                                      PyObject *args)
 {
     PyObject *py_retval;        /* return value */
     PyObject *pyobj_conn;       /* virConnectPtr */
@@ -5074,7 +5078,7 @@ libvirt_virConnectDomainEventRegister(ATTRIBUTE_UNUSED PyObject * self,

     DEBUG("libvirt_virConnectDomainEventRegister(%p %p) called\n",
           pyobj_conn, pyobj_conn_inst);
-    conn   = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
+    conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);

     Py_INCREF(pyobj_conn_inst);

@@ -5082,7 +5086,7 @@ libvirt_virConnectDomainEventRegister(ATTRIBUTE_UNUSED PyObject * self,

     ret = virConnectDomainEventRegister(conn,
                                         libvirt_virConnectDomainEventCallback,
-                                        (void *)pyobj_conn_inst, NULL);
+                                        pyobj_conn_inst, NULL);

     LIBVIRT_END_ALLOW_THREADS;

@@ -5091,8 +5095,8 @@ libvirt_virConnectDomainEventRegister(ATTRIBUTE_UNUSED PyObject * self,
 }

 static PyObject *
-libvirt_virConnectDomainEventDeregister(ATTRIBUTE_UNUSED PyObject * self,
-                                        PyObject * args)
+libvirt_virConnectDomainEventDeregister(ATTRIBUTE_UNUSED PyObject *self,
+                                        PyObject *args)
 {
     PyObject *py_retval;
     PyObject *pyobj_conn;
@@ -5108,7 +5112,7 @@ libvirt_virConnectDomainEventDeregister(ATTRIBUTE_UNUSED PyObject * self,

     DEBUG("libvirt_virConnectDomainEventDeregister(%p) called\n", pyobj_conn);

-    conn   = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
+    conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);

     LIBVIRT_BEGIN_ALLOW_THREADS;

@@ -5659,22 +5663,26 @@ libvirt_virConnectDomainEventLifecycleCallback(virConnectPtr conn ATTRIBUTE_UNUS
 {
     PyObject *pyobj_cbData = (PyObject*)opaque;
     PyObject *pyobj_dom;
-    PyObject *pyobj_ret;
+    PyObject *pyobj_ret = NULL;
     PyObject *pyobj_conn;
     PyObject *dictKey;
     int ret = -1;

     LIBVIRT_ENSURE_THREAD_STATE;

+    if (!(dictKey = libvirt_constcharPtrWrap("conn")))
+        goto cleanup;
+    pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
+    Py_DECREF(dictKey);
+
     /* Create a python instance of this virDomainPtr */
     virDomainRef(dom);
-    pyobj_dom = libvirt_virDomainPtrWrap(dom);
+    if (!(pyobj_dom = libvirt_virDomainPtrWrap(dom))) {
+        virDomainFree(dom);
+        goto cleanup;
+    }
     Py_INCREF(pyobj_cbData);

-    dictKey = libvirt_constcharPtrWrap("conn");
-    pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
-    Py_DECREF(dictKey);
-
     /* Call the Callback Dispatcher */
     pyobj_ret = PyObject_CallMethod(pyobj_conn,
                                     (char*)"_dispatchDomainEventLifecycleCallback",
@@ -5686,6 +5694,7 @@ libvirt_virConnectDomainEventLifecycleCallback(virConnectPtr conn ATTRIBUTE_UNUS
     Py_DECREF(pyobj_cbData);
     Py_DECREF(pyobj_dom);

+ cleanup:
     if (!pyobj_ret) {
         DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
         PyErr_Print();
@@ -5705,22 +5714,26 @@ libvirt_virConnectDomainEventGenericCallback(virConnectPtr conn ATTRIBUTE_UNUSED
 {
     PyObject *pyobj_cbData = (PyObject*)opaque;
     PyObject *pyobj_dom;
-    PyObject *pyobj_ret;
+    PyObject *pyobj_ret = NULL;
     PyObject *pyobj_conn;
     PyObject *dictKey;
     int ret = -1;

     LIBVIRT_ENSURE_THREAD_STATE;

+    if (!(dictKey = libvirt_constcharPtrWrap("conn")))
+        goto cleanup;
+    pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
+    Py_DECREF(dictKey);
+
     /* Create a python instance of this virDomainPtr */
     virDomainRef(dom);
-    pyobj_dom = libvirt_virDomainPtrWrap(dom);
+    if (!(pyobj_dom = libvirt_virDomainPtrWrap(dom))) {
+        virDomainFree(dom);
+        goto cleanup;
+    }
     Py_INCREF(pyobj_cbData);

-    dictKey = libvirt_constcharPtrWrap("conn");
-    pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
-    Py_DECREF(dictKey);
-
     /* Call the Callback Dispatcher */
     pyobj_ret = PyObject_CallMethod(pyobj_conn,
                                     (char*)"_dispatchDomainEventGenericCallback",
@@ -5730,6 +5743,7 @@ libvirt_virConnectDomainEventGenericCallback(virConnectPtr conn ATTRIBUTE_UNUSED
     Py_DECREF(pyobj_cbData);
     Py_DECREF(pyobj_dom);

+ cleanup:
     if (!pyobj_ret) {
         DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
         PyErr_Print();
@@ -5750,22 +5764,26 @@ libvirt_virConnectDomainEventRTCChangeCallback(virConnectPtr conn ATTRIBUTE_UNUS
 {
     PyObject *pyobj_cbData = (PyObject*)opaque;
     PyObject *pyobj_dom;
-    PyObject *pyobj_ret;
+    PyObject *pyobj_ret = NULL;
     PyObject *pyobj_conn;
     PyObject *dictKey;
     int ret = -1;

     LIBVIRT_ENSURE_THREAD_STATE;

+    if (!(dictKey = libvirt_constcharPtrWrap("conn")))
+        goto cleanup;
+    pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
+    Py_DECREF(dictKey);
+
     /* Create a python instance of this virDomainPtr */
     virDomainRef(dom);
-    pyobj_dom = libvirt_virDomainPtrWrap(dom);
+    if (!(pyobj_dom = libvirt_virDomainPtrWrap(dom))) {
+        virDomainFree(dom);
+        goto cleanup;
+    }
     Py_INCREF(pyobj_cbData);

-    dictKey = libvirt_constcharPtrWrap("conn");
-    pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
-    Py_DECREF(dictKey);
-
     /* Call the Callback Dispatcher */
     pyobj_ret = PyObject_CallMethod(pyobj_conn,
                                     (char*)"_dispatchDomainEventRTCChangeCallback",
@@ -5777,6 +5795,7 @@ libvirt_virConnectDomainEventRTCChangeCallback(virConnectPtr conn ATTRIBUTE_UNUS
     Py_DECREF(pyobj_cbData);
     Py_DECREF(pyobj_dom);

+ cleanup:
     if (!pyobj_ret) {
         DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
         PyErr_Print();
@@ -5797,22 +5816,26 @@ libvirt_virConnectDomainEventWatchdogCallback(virConnectPtr conn ATTRIBUTE_UNUSE
 {
     PyObject *pyobj_cbData = (PyObject*)opaque;
     PyObject *pyobj_dom;
-    PyObject *pyobj_ret;
+    PyObject *pyobj_ret = NULL;
     PyObject *pyobj_conn;
     PyObject *dictKey;
     int ret = -1;

     LIBVIRT_ENSURE_THREAD_STATE;

+    if (!(dictKey = libvirt_constcharPtrWrap("conn")))
+        goto cleanup;
+    pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
+    Py_DECREF(dictKey);
+
     /* Create a python instance of this virDomainPtr */
     virDomainRef(dom);
-    pyobj_dom = libvirt_virDomainPtrWrap(dom);
+    if (!(pyobj_dom = libvirt_virDomainPtrWrap(dom))) {
+        virDomainFree(dom);
+        goto cleanup;
+    }
     Py_INCREF(pyobj_cbData);

-    dictKey = libvirt_constcharPtrWrap("conn");
-    pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
-    Py_DECREF(dictKey);
-
     /* Call the Callback Dispatcher */
     pyobj_ret = PyObject_CallMethod(pyobj_conn,
                                     (char*)"_dispatchDomainEventWatchdogCallback",
@@ -5824,6 +5847,7 @@ libvirt_virConnectDomainEventWatchdogCallback(virConnectPtr conn ATTRIBUTE_UNUSE
     Py_DECREF(pyobj_cbData);
     Py_DECREF(pyobj_dom);

+ cleanup:
     if (!pyobj_ret) {
         DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
         PyErr_Print();
@@ -5846,22 +5870,26 @@ libvirt_virConnectDomainEventIOErrorCallback(virConnectPtr conn ATTRIBUTE_UNUSED
 {
     PyObject *pyobj_cbData = (PyObject*)opaque;
     PyObject *pyobj_dom;
-    PyObject *pyobj_ret;
+    PyObject *pyobj_ret = NULL;
     PyObject *pyobj_conn;
     PyObject *dictKey;
     int ret = -1;

     LIBVIRT_ENSURE_THREAD_STATE;

+    if (!(dictKey = libvirt_constcharPtrWrap("conn")))
+        goto cleanup;
+    pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
+    Py_DECREF(dictKey);
+
     /* Create a python instance of this virDomainPtr */
     virDomainRef(dom);
-    pyobj_dom = libvirt_virDomainPtrWrap(dom);
+    if (!(pyobj_dom = libvirt_virDomainPtrWrap(dom))) {
+        virDomainFree(dom);
+        goto cleanup;
+    }
     Py_INCREF(pyobj_cbData);

-    dictKey = libvirt_constcharPtrWrap("conn");
-    pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
-    Py_DECREF(dictKey);
-
     /* Call the Callback Dispatcher */
     pyobj_ret = PyObject_CallMethod(pyobj_conn,
                                     (char*)"_dispatchDomainEventIOErrorCallback",
@@ -5873,6 +5901,7 @@ libvirt_virConnectDomainEventIOErrorCallback(virConnectPtr conn ATTRIBUTE_UNUSED
     Py_DECREF(pyobj_cbData);
     Py_DECREF(pyobj_dom);

+ cleanup:
     if (!pyobj_ret) {
         DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
         PyErr_Print();
@@ -5896,22 +5925,26 @@ libvirt_virConnectDomainEventIOErrorReasonCallback(virConnectPtr conn ATTRIBUTE_
 {
     PyObject *pyobj_cbData = (PyObject*)opaque;
     PyObject *pyobj_dom;
-    PyObject *pyobj_ret;
+    PyObject *pyobj_ret = NULL;
     PyObject *pyobj_conn;
     PyObject *dictKey;
     int ret = -1;

     LIBVIRT_ENSURE_THREAD_STATE;

+    if (!(dictKey = libvirt_constcharPtrWrap("conn")))
+        goto cleanup;
+    pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
+    Py_DECREF(dictKey);
+
     /* Create a python instance of this virDomainPtr */
     virDomainRef(dom);
-    pyobj_dom = libvirt_virDomainPtrWrap(dom);
+    if (!(pyobj_dom = libvirt_virDomainPtrWrap(dom))) {
+        virDomainFree(dom);
+        goto cleanup;
+    }
     Py_INCREF(pyobj_cbData);

-    dictKey = libvirt_constcharPtrWrap("conn");
-    pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
-    Py_DECREF(dictKey);
-
     /* Call the Callback Dispatcher */
     pyobj_ret = PyObject_CallMethod(pyobj_conn,
                                     (char*)"_dispatchDomainEventIOErrorReasonCallback",
@@ -5923,6 +5956,7 @@ libvirt_virConnectDomainEventIOErrorReasonCallback(virConnectPtr conn ATTRIBUTE_
     Py_DECREF(pyobj_cbData);
     Py_DECREF(pyobj_dom);

+ cleanup:
     if (!pyobj_ret) {
         DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
         PyErr_Print();
@@ -5947,7 +5981,7 @@ libvirt_virConnectDomainEventGraphicsCallback(virConnectPtr conn ATTRIBUTE_UNUSE
 {
     PyObject *pyobj_cbData = (PyObject*)opaque;
     PyObject *pyobj_dom;
-    PyObject *pyobj_ret;
+    PyObject *pyobj_ret = NULL;
     PyObject *pyobj_conn;
     PyObject *dictKey;
     PyObject *pyobj_local;
@@ -5958,15 +5992,20 @@ libvirt_virConnectDomainEventGraphicsCallback(virConnectPtr conn ATTRIBUTE_UNUSE

     LIBVIRT_ENSURE_THREAD_STATE;

+    if (!(dictKey = libvirt_constcharPtrWrap("conn")))
+        goto cleanup;
+    pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
+    Py_DECREF(dictKey);
+
     /* Create a python instance of this virDomainPtr */
     virDomainRef(dom);
-    pyobj_dom = libvirt_virDomainPtrWrap(dom);
+    if (!(pyobj_dom = libvirt_virDomainPtrWrap(dom))) {
+        virDomainFree(dom);
+        goto cleanup;
+    }
     Py_INCREF(pyobj_cbData);

-    dictKey = libvirt_constcharPtrWrap("conn");
-    pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
-    Py_DECREF(dictKey);
-
+    /* FIXME This code should check for errors... */
     pyobj_local = PyDict_New();
     PyDict_SetItem(pyobj_local,
                    libvirt_constcharPtrWrap("family"),
@@ -6010,6 +6049,7 @@ libvirt_virConnectDomainEventGraphicsCallback(virConnectPtr conn ATTRIBUTE_UNUSE
     Py_DECREF(pyobj_cbData);
     Py_DECREF(pyobj_dom);

+ cleanup:
     if (!pyobj_ret) {
         DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
         PyErr_Print();
@@ -6032,22 +6072,26 @@ libvirt_virConnectDomainEventBlockJobCallback(virConnectPtr conn ATTRIBUTE_UNUSE
 {
     PyObject *pyobj_cbData = (PyObject*)opaque;
     PyObject *pyobj_dom;
-    PyObject *pyobj_ret;
+    PyObject *pyobj_ret = NULL;
     PyObject *pyobj_conn;
     PyObject *dictKey;
     int ret = -1;

     LIBVIRT_ENSURE_THREAD_STATE;

+    if (!(dictKey = libvirt_constcharPtrWrap("conn")))
+        goto cleanup;
+    pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
+    Py_DECREF(dictKey);
+
     /* Create a python instance of this virDomainPtr */
     virDomainRef(dom);
-    pyobj_dom = libvirt_virDomainPtrWrap(dom);
+    if (!(pyobj_dom = libvirt_virDomainPtrWrap(dom))) {
+        virDomainFree(dom);
+        goto cleanup;
+    }
     Py_INCREF(pyobj_cbData);

-    dictKey = libvirt_constcharPtrWrap("conn");
-    pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
-    Py_DECREF(dictKey);
-
     /* Call the Callback Dispatcher */
     pyobj_ret = PyObject_CallMethod(pyobj_conn,
                                     (char*)"_dispatchDomainEventBlockPullCallback",
@@ -6057,10 +6101,9 @@ libvirt_virConnectDomainEventBlockJobCallback(virConnectPtr conn ATTRIBUTE_UNUSE
     Py_DECREF(pyobj_cbData);
     Py_DECREF(pyobj_dom);

+ cleanup:
     if (!pyobj_ret) {
-#if DEBUG_ERROR
-        printf("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
-#endif
+        DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
         PyErr_Print();
     } else {
         Py_DECREF(pyobj_ret);
@@ -6082,22 +6125,26 @@ libvirt_virConnectDomainEventDiskChangeCallback(virConnectPtr conn ATTRIBUTE_UNU
 {
     PyObject *pyobj_cbData = (PyObject*)opaque;
     PyObject *pyobj_dom;
-    PyObject *pyobj_ret;
+    PyObject *pyobj_ret = NULL;
     PyObject *pyobj_conn;
     PyObject *dictKey;
     int ret = -1;

     LIBVIRT_ENSURE_THREAD_STATE;
-    /* Create a python instance of this virDomainPtr */
-    virDomainRef(dom);

-    pyobj_dom = libvirt_virDomainPtrWrap(dom);
-    Py_INCREF(pyobj_cbData);
-
-    dictKey = libvirt_constcharPtrWrap("conn");
+    if (!(dictKey = libvirt_constcharPtrWrap("conn")))
+        goto cleanup;
     pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
     Py_DECREF(dictKey);

+    /* Create a python instance of this virDomainPtr */
+    virDomainRef(dom);
+    if (!(pyobj_dom = libvirt_virDomainPtrWrap(dom))) {
+        virDomainFree(dom);
+        goto cleanup;
+    }
+    Py_INCREF(pyobj_cbData);
+
     /* Call the Callback Dispatcher */
     pyobj_ret = PyObject_CallMethod(pyobj_conn,
                                     (char*)"_dispatchDomainEventDiskChangeCallback",
@@ -6109,6 +6156,7 @@ libvirt_virConnectDomainEventDiskChangeCallback(virConnectPtr conn ATTRIBUTE_UNU
     Py_DECREF(pyobj_cbData);
     Py_DECREF(pyobj_dom);

+ cleanup:
     if (!pyobj_ret) {
         DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
         PyErr_Print();
@@ -6130,22 +6178,26 @@ libvirt_virConnectDomainEventTrayChangeCallback(virConnectPtr conn ATTRIBUTE_UNU
 {
     PyObject *pyobj_cbData = (PyObject*)opaque;
     PyObject *pyobj_dom;
-    PyObject *pyobj_ret;
+    PyObject *pyobj_ret = NULL;
     PyObject *pyobj_conn;
     PyObject *dictKey;
     int ret = -1;

     LIBVIRT_ENSURE_THREAD_STATE;
-    /* Create a python instance of this virDomainPtr */
-    virDomainRef(dom);

-    pyobj_dom = libvirt_virDomainPtrWrap(dom);
-    Py_INCREF(pyobj_cbData);
-
-    dictKey = libvirt_constcharPtrWrap("conn");
+    if (!(dictKey = libvirt_constcharPtrWrap("conn")))
+        goto cleanup;
     pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
     Py_DECREF(dictKey);

+    /* Create a python instance of this virDomainPtr */
+    virDomainRef(dom);
+    if (!(pyobj_dom = libvirt_virDomainPtrWrap(dom))) {
+        virDomainFree(dom);
+        goto cleanup;
+    }
+    Py_INCREF(pyobj_cbData);
+
     /* Call the Callback Dispatcher */
     pyobj_ret = PyObject_CallMethod(pyobj_conn,
                                     (char*)"_dispatchDomainEventTrayChangeCallback",
@@ -6156,6 +6208,7 @@ libvirt_virConnectDomainEventTrayChangeCallback(virConnectPtr conn ATTRIBUTE_UNU
     Py_DECREF(pyobj_cbData);
     Py_DECREF(pyobj_dom);

+ cleanup:
     if (!pyobj_ret) {
         DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
         PyErr_Print();
@@ -6176,22 +6229,26 @@ libvirt_virConnectDomainEventPMWakeupCallback(virConnectPtr conn ATTRIBUTE_UNUSE
 {
     PyObject *pyobj_cbData = (PyObject*)opaque;
     PyObject *pyobj_dom;
-    PyObject *pyobj_ret;
+    PyObject *pyobj_ret = NULL;
     PyObject *pyobj_conn;
     PyObject *dictKey;
     int ret = -1;

     LIBVIRT_ENSURE_THREAD_STATE;
-    /* Create a python instance of this virDomainPtr */
-    virDomainRef(dom);

-    pyobj_dom = libvirt_virDomainPtrWrap(dom);
-    Py_INCREF(pyobj_cbData);
-
-    dictKey = libvirt_constcharPtrWrap("conn");
+    if (!(dictKey = libvirt_constcharPtrWrap("conn")))
+        goto cleanup;
     pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
     Py_DECREF(dictKey);

+    /* Create a python instance of this virDomainPtr */
+    virDomainRef(dom);
+    if (!(pyobj_dom = libvirt_virDomainPtrWrap(dom))) {
+        virDomainFree(dom);
+        goto cleanup;
+    }
+    Py_INCREF(pyobj_cbData);
+
     /* Call the Callback Dispatcher */
     pyobj_ret = PyObject_CallMethod(pyobj_conn,
                                     (char*)"_dispatchDomainEventPMWakeupCallback",
@@ -6203,6 +6260,7 @@ libvirt_virConnectDomainEventPMWakeupCallback(virConnectPtr conn ATTRIBUTE_UNUSE
     Py_DECREF(pyobj_cbData);
     Py_DECREF(pyobj_dom);

+ cleanup:
     if (!pyobj_ret) {
         DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
         PyErr_Print();
@@ -6223,22 +6281,26 @@ libvirt_virConnectDomainEventPMSuspendCallback(virConnectPtr conn ATTRIBUTE_UNUS
 {
     PyObject *pyobj_cbData = (PyObject*)opaque;
     PyObject *pyobj_dom;
-    PyObject *pyobj_ret;
+    PyObject *pyobj_ret = NULL;
     PyObject *pyobj_conn;
     PyObject *dictKey;
     int ret = -1;

     LIBVIRT_ENSURE_THREAD_STATE;
-    /* Create a python instance of this virDomainPtr */
-    virDomainRef(dom);

-    pyobj_dom = libvirt_virDomainPtrWrap(dom);
-    Py_INCREF(pyobj_cbData);
-
-    dictKey = libvirt_constcharPtrWrap("conn");
+    if (!(dictKey = libvirt_constcharPtrWrap("conn")))
+        goto cleanup;
     pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
     Py_DECREF(dictKey);

+    /* Create a python instance of this virDomainPtr */
+    virDomainRef(dom);
+    if (!(pyobj_dom = libvirt_virDomainPtrWrap(dom))) {
+        virDomainFree(dom);
+        goto cleanup;
+    }
+    Py_INCREF(pyobj_cbData);
+
     /* Call the Callback Dispatcher */
     pyobj_ret = PyObject_CallMethod(pyobj_conn,
                                     (char*)"_dispatchDomainEventPMSuspendCallback",
@@ -6250,6 +6312,7 @@ libvirt_virConnectDomainEventPMSuspendCallback(virConnectPtr conn ATTRIBUTE_UNUS
     Py_DECREF(pyobj_cbData);
     Py_DECREF(pyobj_dom);

+ cleanup:
     if (!pyobj_ret) {
         DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
         PyErr_Print();
@@ -6272,22 +6335,26 @@ libvirt_virConnectDomainEventBalloonChangeCallback(virConnectPtr conn ATTRIBUTE_
 {
     PyObject *pyobj_cbData = (PyObject*)opaque;
     PyObject *pyobj_dom;
-    PyObject *pyobj_ret;
+    PyObject *pyobj_ret = NULL;
     PyObject *pyobj_conn;
     PyObject *dictKey;
     int ret = -1;

     LIBVIRT_ENSURE_THREAD_STATE;

+    if (!(dictKey = libvirt_constcharPtrWrap("conn")))
+        goto cleanup;
+    pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
+    Py_DECREF(dictKey);
+
     /* Create a python instance of this virDomainPtr */
     virDomainRef(dom);
-    pyobj_dom = libvirt_virDomainPtrWrap(dom);
+    if (!(pyobj_dom = libvirt_virDomainPtrWrap(dom))) {
+        virDomainFree(dom);
+        goto cleanup;
+    }
     Py_INCREF(pyobj_cbData);

-    dictKey = libvirt_constcharPtrWrap("conn");
-    pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
-    Py_DECREF(dictKey);
-
     /* Call the Callback Dispatcher */
     pyobj_ret = PyObject_CallMethod(pyobj_conn,
                                     (char*)"_dispatchDomainEventBalloonChangeCallback",
@@ -6299,6 +6366,7 @@ libvirt_virConnectDomainEventBalloonChangeCallback(virConnectPtr conn ATTRIBUTE_
     Py_DECREF(pyobj_cbData);
     Py_DECREF(pyobj_dom);

+ cleanup:
     if (!pyobj_ret) {
         DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
         PyErr_Print();
@@ -6321,22 +6389,26 @@ libvirt_virConnectDomainEventPMSuspendDiskCallback(virConnectPtr conn ATTRIBUTE_
 {
     PyObject *pyobj_cbData = (PyObject*)opaque;
     PyObject *pyobj_dom;
-    PyObject *pyobj_ret;
+    PyObject *pyobj_ret = NULL;
     PyObject *pyobj_conn;
     PyObject *dictKey;
     int ret = -1;

     LIBVIRT_ENSURE_THREAD_STATE;
-    /* Create a python instance of this virDomainPtr */
-    virDomainRef(dom);

-    pyobj_dom = libvirt_virDomainPtrWrap(dom);
-    Py_INCREF(pyobj_cbData);
-
-    dictKey = libvirt_constcharPtrWrap("conn");
+    if (!(dictKey = libvirt_constcharPtrWrap("conn")))
+        goto cleanup;
     pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
     Py_DECREF(dictKey);

+    /* Create a python instance of this virDomainPtr */
+    virDomainRef(dom);
+    if (!(pyobj_dom = libvirt_virDomainPtrWrap(dom))) {
+        virDomainFree(dom);
+        goto cleanup;
+    }
+    Py_INCREF(pyobj_cbData);
+
     /* Call the Callback Dispatcher */
     pyobj_ret = PyObject_CallMethod(pyobj_conn,
                                     (char*)"_dispatchDomainEventPMSuspendDiskCallback",
@@ -6348,6 +6420,7 @@ libvirt_virConnectDomainEventPMSuspendDiskCallback(virConnectPtr conn ATTRIBUTE_
     Py_DECREF(pyobj_cbData);
     Py_DECREF(pyobj_dom);

+ cleanup:
     if (!pyobj_ret) {
         DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
         PyErr_Print();
@@ -6370,22 +6443,26 @@ libvirt_virConnectDomainEventDeviceRemovedCallback(virConnectPtr conn ATTRIBUTE_
 {
     PyObject *pyobj_cbData = (PyObject*)opaque;
     PyObject *pyobj_dom;
-    PyObject *pyobj_ret;
+    PyObject *pyobj_ret = NULL;
     PyObject *pyobj_conn;
     PyObject *dictKey;
     int ret = -1;

     LIBVIRT_ENSURE_THREAD_STATE;
-    /* Create a python instance of this virDomainPtr */
-    virDomainRef(dom);

-    pyobj_dom = libvirt_virDomainPtrWrap(dom);
-    Py_INCREF(pyobj_cbData);
-
-    dictKey = libvirt_constcharPtrWrap("conn");
+    if (!(dictKey = libvirt_constcharPtrWrap("conn")))
+        goto cleanup;
     pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
     Py_DECREF(dictKey);

+    /* Create a python instance of this virDomainPtr */
+    virDomainRef(dom);
+    if (!(pyobj_dom = libvirt_virDomainPtrWrap(dom))) {
+        virDomainFree(dom);
+        goto cleanup;
+    }
+    Py_INCREF(pyobj_cbData);
+
     /* Call the Callback Dispatcher */
     pyobj_ret = PyObject_CallMethod(pyobj_conn,
                                     (char*)"_dispatchDomainEventDeviceRemovedCallback",
@@ -6395,6 +6472,7 @@ libvirt_virConnectDomainEventDeviceRemovedCallback(virConnectPtr conn ATTRIBUTE_
     Py_DECREF(pyobj_cbData);
     Py_DECREF(pyobj_dom);

+ cleanup:
     if (!pyobj_ret) {
         DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
         PyErr_Print();
@@ -6409,8 +6487,8 @@ libvirt_virConnectDomainEventDeviceRemovedCallback(virConnectPtr conn ATTRIBUTE_
 #endif /* LIBVIR_CHECK_VERSION(1, 1, 1) */

 static PyObject *
-libvirt_virConnectDomainEventRegisterAny(ATTRIBUTE_UNUSED PyObject * self,
-                                         PyObject * args)
+libvirt_virConnectDomainEventRegisterAny(ATTRIBUTE_UNUSED PyObject *self,
+                                         PyObject *args)
 {
     PyObject *py_retval;        /* return value */
     PyObject *pyobj_conn;       /* virConnectPtr */
@@ -6517,8 +6595,8 @@ libvirt_virConnectDomainEventRegisterAny(ATTRIBUTE_UNUSED PyObject * self,
 }

 static PyObject *
-libvirt_virConnectDomainEventDeregisterAny(ATTRIBUTE_UNUSED PyObject * self,
-                                           PyObject * args)
+libvirt_virConnectDomainEventDeregisterAny(ATTRIBUTE_UNUSED PyObject *self,
+                                           PyObject *args)
 {
     PyObject *py_retval;
     PyObject *pyobj_conn;
@@ -6533,7 +6611,7 @@ libvirt_virConnectDomainEventDeregisterAny(ATTRIBUTE_UNUSED PyObject * self,

     DEBUG("libvirt_virConnectDomainEventDeregister(%p) called\n", pyobj_conn);

-    conn   = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
+    conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);

     LIBVIRT_BEGIN_ALLOW_THREADS;

@@ -6563,22 +6641,24 @@ libvirt_virConnectNetworkEventLifecycleCallback(virConnectPtr conn ATTRIBUTE_UNU
 {
     PyObject *pyobj_cbData = (PyObject*)opaque;
     PyObject *pyobj_net;
-    PyObject *pyobj_ret;
+    PyObject *pyobj_ret = NULL;
     PyObject *pyobj_conn;
     PyObject *dictKey;
     int ret = -1;

     LIBVIRT_ENSURE_THREAD_STATE;

-    dictKey = libvirt_constcharPtrWrap("conn");
-    if (!dictKey)
-        return ret;
+    if (!(dictKey = libvirt_constcharPtrWrap("conn")))
+        goto cleanup;
     pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
     Py_DECREF(dictKey);

     /* Create a python instance of this virNetworkPtr */
     virNetworkRef(net);
-    pyobj_net = libvirt_virNetworkPtrWrap(net);
+    if (!(pyobj_net = libvirt_virNetworkPtrWrap(net))) {
+        virNetworkFree(net);
+        goto cleanup;
+    }
     Py_INCREF(pyobj_cbData);

     /* Call the Callback Dispatcher */
@@ -6593,6 +6673,7 @@ libvirt_virConnectNetworkEventLifecycleCallback(virConnectPtr conn ATTRIBUTE_UNU
     Py_DECREF(pyobj_cbData);
     Py_DECREF(pyobj_net);

+ cleanup:
     if (!pyobj_ret) {
         DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
         PyErr_Print();
@@ -6680,7 +6761,7 @@ static PyObject

     DEBUG("libvirt_virConnectNetworkEventDeregister(%p) called\n", pyobj_conn);

-    conn   = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
+    conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);

     LIBVIRT_BEGIN_ALLOW_THREADS;

-- 
1.8.5.3




More information about the libvir-list mailing list