]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
python: don't mask libvirt errors
authorEric Blake <eblake@redhat.com>
Fri, 31 Aug 2012 17:07:19 +0000 (10:07 -0700)
committerEric Blake <eblake@redhat.com>
Fri, 31 Aug 2012 21:31:13 +0000 (14:31 -0700)
A user reported this crash when using python bindings:

  File "/home/nox/workspace/NOX/src/NOX/hooks.py", line 134, in trigger
    hook.trigger(event)
  File "/home/nox/workspace/NOX/src/NOX/hooks.py", line 33, in trigger
    self.handlers[event]()
  File "/home/nox/workspace/NOX/hooks/volatility.py", line 81, in memory_dump
    for block in Memory(self.ctx):
  File "/home/see/workspace/NOX/src/NOX/lib/libtools.py", line 179, in next
    libvirt.VIR_MEMORY_PHYSICAL)
  File "/usr/lib/python2.7/dist-packages/libvirt.py", line 1759, in memoryPeek
    ret = libvirtmod.virDomainMemoryPeek(self._o, start, size, flags)
SystemError: error return without exception set

In the python bindings, returning NULL makes python think an
exception was thrown, while returning the None object lets the
wrappers know that a libvirt error exists.

Reported by Nox DaFox, fix suggested by Dan Berrange.

* python/libvirt-override.c (libvirt_virDomainBlockPeek)
(libvirt_virDomainMemoryPeek): Return python's None object, so
wrapper knows to check libvirt error.

python/libvirt-override.c

index 8b41dff2a33f8e75fdf0cf5bd5fc633e8eb9f344..65e8c69ddc370576ec45a84ec86cc76fe5c59511 100644 (file)
@@ -5763,8 +5763,10 @@ libvirt_virDomainBlockPeek(PyObject *self ATTRIBUTE_UNUSED,
     c_retval = virDomainBlockPeek(domain, disk, offset, size, buf, flags);
     LIBVIRT_END_ALLOW_THREADS;
 
-    if (c_retval < 0)
+    if (c_retval < 0) {
+        py_retval = VIR_PY_NONE;
         goto cleanup;
+    }
 
     py_retval = PyString_FromStringAndSize(buf, size);
 
@@ -5798,8 +5800,10 @@ libvirt_virDomainMemoryPeek(PyObject *self ATTRIBUTE_UNUSED,
     c_retval = virDomainMemoryPeek(domain, start, size, buf, flags);
     LIBVIRT_END_ALLOW_THREADS;
 
-    if (c_retval < 0)
+    if (c_retval < 0) {
+        py_retval = VIR_PY_NONE;
         goto cleanup;
+    }
 
     py_retval = PyString_FromStringAndSize(buf, size);