When the last callback is removed using domainEventDeregister(), the
events dispatcher is deregistered from the C-library, but
domainEventsCallbacks is still an empty list.
On shutdown __del__() deregisters the dispatacher again, which SEGVs

        # You need the event-loop implementation from the Python examples;
        # give the file a name which is importable by Python.
        ln examples/domain-events/events-python/event-test.py eloop.py
        python -c 'from eloop import *
        import sys

        def dump(*args): print " ".join(map(str, args))

        virEventLoopPureStart()
        c = libvirt.open("xen:///")
        c.domainEventRegister(dump, None)
        c.domainEventDeregister(dump)
        sys.exit(0)'

domainEventDeregister() needs to delete domainEventCallbacks so subsequent
calls to __del__() and domainEventRegister() choose the right code paths.
Setting it to None is not enough, since calling domainEventRegiser() again
would trigger an TypeError.

Signed-off-by: Philipp Hahn <h...@univention.de>
---
 python/libvirt-override-virConnect.py |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/python/libvirt-override-virConnect.py b/python/libvirt-override-virConnect.py
index 52914dc..e344303 100644
--- a/python/libvirt-override-virConnect.py
+++ b/python/libvirt-override-virConnect.py
@@ -2,7 +2,7 @@
         try:
            for cb,opaque in self.domainEventCallbacks.items():
                del self.domainEventCallbacks[cb]
-           self.domainEventCallbacks = None
+           del self.domainEventCallbacks
            libvirtmod.virConnectDomainEventDeregister(self._o, self)
         except AttributeError:
            pass
@@ -17,6 +17,7 @@
         try:
             del self.domainEventCallbacks[cb]
             if len(self.domainEventCallbacks) == 0:
+                del self.domainEventCallbacks
                 ret = libvirtmod.virConnectDomainEventDeregister(self._o, self)
                 if ret == -1: raise libvirtError ('virConnectDomainEventDeregister() failed', conn=self)
         except AttributeError:
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to