From 9ef36632ca76ea11b5227e977a9fb9db3fad0d01 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Tue, 28 Aug 2012 17:48:19 +0100 Subject: launch: libvirt: Don't crash if shutdown_libvirt is called early in launch. The assert (conn != NULL) was being triggered with this stack trace: at launch-libvirt.c:1305 fd=, error_if_eof=error_if_eof@entry=0) at proto.c:222 size_rtn=size_rtn@entry=0x7fffffffdb34, buf_rtn=buf_rtn@entry=0x7fffffffdb58) at proto.c:548 libvirt_uri=) at launch-libvirt.c:391 --- src/launch-libvirt.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/launch-libvirt.c b/src/launch-libvirt.c index f5f641a4..760c99f2 100644 --- a/src/launch-libvirt.c +++ b/src/launch-libvirt.c @@ -1302,16 +1302,21 @@ shutdown_libvirt (guestfs_h *g) virDomainPtr dom = g->virt.domv; int ret = 0; - assert (conn != NULL); - assert (dom != NULL); + /* Note that we can be called back very early in launch (specifically + * from launch_libvirt itself), when conn and dom might be NULL. + */ - /* XXX Need to be graceful? */ - if (virDomainDestroyFlags (dom, 0) == -1) { - libvirt_error (g, _("could not destroy libvirt domain")); - ret = -1; + if (dom != NULL) { + /* XXX Need to be graceful? */ + if (virDomainDestroyFlags (dom, 0) == -1) { + libvirt_error (g, _("could not destroy libvirt domain")); + ret = -1; + } + virDomainFree (dom); } - virDomainFree (dom); - virConnectClose (conn); + + if (conn != NULL) + virConnectClose (conn); g->virt.connv = g->virt.domv = NULL; -- cgit