[libvirt] [PATCH 1/4] Fix crash when cleaning up from failed save attempt

Daniel Veillard veillard at redhat.com
Wed Apr 21 20:33:41 UTC 2010


On Wed, Apr 21, 2010 at 05:56:10PM +0100, Daniel P. Berrange wrote:
> If a transient QEMU crashes during save attempt, then the virDomainPtr
> object may be freed. If a persistent QEMU crashes during save, then
> the 'priv->mon' field is no longer valid since it will be inactive.
> 
> * src/qemu/qemu_driver.c: Fix two crashes when QEMU exits
>   during a save attempt
> ---
>  src/qemu/qemu_driver.c |   36 ++++++++++++++++++++++--------------
>  1 files changed, 22 insertions(+), 14 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 39feac7..91fe963 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -4997,19 +4997,20 @@ static int qemudDomainSaveFlag(virDomainPtr dom, const char *path,
>      }
>  
>  endjob:
> -    if (ret != 0 && header.was_running) {
> -        qemuDomainObjEnterMonitorWithDriver(driver, vm);
> -        rc = qemuMonitorStartCPUs(priv->mon, dom->conn);
> -        qemuDomainObjExitMonitorWithDriver(driver, vm);
> -        if (rc < 0)
> -            VIR_WARN0("Unable to resume guest CPUs after save failure");
> -        else
> -            vm->state = VIR_DOMAIN_RUNNING;
> -    }
> +    if (vm) {
> +        if (ret != 0 && header.was_running && priv->mon) {
> +            qemuDomainObjEnterMonitorWithDriver(driver, vm);
> +            rc = qemuMonitorStartCPUs(priv->mon, dom->conn);
> +            qemuDomainObjExitMonitorWithDriver(driver, vm);
> +            if (rc < 0)
> +                VIR_WARN0("Unable to resume guest CPUs after save failure");
> +            else
> +                vm->state = VIR_DOMAIN_RUNNING;
> +        }
>  
> -    if (vm &&
> -        qemuDomainObjEndJob(vm) == 0)
> +        if (qemuDomainObjEndJob(vm) == 0)
>              vm = NULL;
> +    }
>  
>  cleanup:
>      VIR_FREE(xml);
> @@ -7185,9 +7186,16 @@ static int qemudDomainAttachNetDevice(virConnectPtr conn,
>      }
>  
>      /* FIXME - need to support vhost-net here (5th arg) */
> -    if (!(netstr = qemuBuildHostNetStr(net, ' ',
> -                                       vlan, tapfd_name, 0)))
> -        goto try_tapfd_close;
> +    if ((qemuCmdFlags & QEMUD_CMD_FLAG_NETDEV) &&
> +        (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE)) {
> +        if (!(netstr = qemuBuildHostNetStr(net, ',',
> +                                           -1, tapfd_name, 0)))
> +            goto try_tapfd_close;
> +    } else {
> +        if (!(netstr = qemuBuildHostNetStr(net, ' ',
> +                                           vlan, tapfd_name, 0)))
> +            goto try_tapfd_close;
> +    }
>  
>      qemuDomainObjEnterMonitorWithDriver(driver, vm);
>      if ((qemuCmdFlags & QEMUD_CMD_FLAG_NETDEV) &&

  ACK,

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list