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(a)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