diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 30565d500217e1e1b9554c4a82bf22155427feaa..5e313e3972bf8c1232a1a06eaf4020a5d40ceb19 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -3609,6 +3609,7 @@ qemuDomainRemoveRNGDevice(virQEMUDriverPtr driver, virObjectEventPtr event; char *charAlias = NULL; char *objAlias = NULL; + char *tlsAlias = NULL; qemuDomainObjPrivatePtr priv = vm->privateData; ssize_t idx; int ret = -1; @@ -3617,17 +3618,26 @@ qemuDomainRemoveRNGDevice(virQEMUDriverPtr driver, VIR_DEBUG("Removing RNG device %s from domain %p %s", rng->info.alias, vm, vm->def->name); + if (virAsprintf(&objAlias, "obj%s", rng->info.alias) < 0) goto cleanup; if (!(charAlias = qemuAliasChardevFromDevAlias(rng->info.alias))) goto cleanup; + if (rng->backend == VIR_DOMAIN_RNG_BACKEND_EGD && + !(tlsAlias = qemuAliasTLSObjFromChardevAlias(charAlias))) + goto cleanup; + qemuDomainObjEnterMonitor(driver, vm); + rc = qemuMonitorDelObject(priv->mon, objAlias); - if (rc == 0 && rng->backend == VIR_DOMAIN_RNG_BACKEND_EGD) + if (rc == 0 && rng->backend == VIR_DOMAIN_RNG_BACKEND_EGD) { ignore_value(qemuMonitorDetachCharDev(priv->mon, charAlias)); + if (tlsAlias) + ignore_value(qemuMonitorDelObject(priv->mon, tlsAlias)); + } if (qemuDomainObjExitMonitor(driver, vm) < 0) goto cleanup; @@ -3649,6 +3659,7 @@ qemuDomainRemoveRNGDevice(virQEMUDriverPtr driver, cleanup: VIR_FREE(charAlias); VIR_FREE(objAlias); + VIR_FREE(tlsAlias); return ret; }