A recent patch made the qemudGetCapabilities() method blow away and re-create the QEMU driver's capabilities object. Unfortunately it did not re-initialize the security model capabilities data. It also left open the possibility that the QEMU driver could be left with no active capabilities object at all in the case of OOM. Thus, this patch . - Splits the security capabilities init code out to be callable independantly of init of the security driver itself - Makes qemudGetCapabilities repopopulate security driver info - Don't free the existing capabilities object until we have successfully created a new one Daniel Index: src/qemu_driver.c =================================================================== RCS file: /data/cvs/libvirt/src/qemu_driver.c,v retrieving revision 1.255 diff -u -p -r1.255 qemu_driver.c --- src/qemu_driver.c 16 Jun 2009 15:42:46 -0000 1.255 +++ src/qemu_driver.c 18 Jun 2009 11:38:10 -0000 @@ -347,12 +347,43 @@ qemuReconnectDomains(struct qemud_driver } } + +static int +qemudSecurityCapsInit(virSecurityDriverPtr secdrv, + virCapsPtr caps) +{ + const char *doi, *model; + + doi = virSecurityDriverGetDOI(secdrv); + model = virSecurityDriverGetModel(secdrv); + + caps->host.secModel.model = strdup(model); + if (!caps->host.secModel.model) { + char ebuf[1024]; + VIR_ERROR(_("Failed to copy secModel model: %s"), + virStrerror(errno, ebuf, sizeof ebuf)); + return -1; + } + + caps->host.secModel.doi = strdup(doi); + if (!caps->host.secModel.doi) { + char ebuf[1024]; + VIR_ERROR(_("Failed to copy secModel DOI: %s"), + virStrerror(errno, ebuf, sizeof ebuf)); + return -1; + } + + VIR_DEBUG("Initialized caps for security driver \"%s\" with " + "DOI \"%s\"", model, doi); + + return 0; +} + + static int qemudSecurityInit(struct qemud_driver *qemud_drv) { int ret; - const char *doi, *model; - virCapsPtr caps; virSecurityDriverPtr security_drv; ret = virSecurityDriverStartup(&security_drv, @@ -368,36 +399,17 @@ qemudSecurityInit(struct qemud_driver *q } qemud_drv->securityDriver = security_drv; - doi = virSecurityDriverGetDOI(security_drv); - model = virSecurityDriverGetModel(security_drv); - VIR_DEBUG("Initialized security driver \"%s\" with " - "DOI \"%s\"", model, doi); + VIR_INFO("Initialized security driver %s", security_drv->name); /* * Add security policy host caps now that the security driver is * initialized. */ - caps = qemud_drv->caps; - - caps->host.secModel.model = strdup(model); - if (!caps->host.secModel.model) { - char ebuf[1024]; - VIR_ERROR(_("Failed to copy secModel model: %s"), - virStrerror(errno, ebuf, sizeof ebuf)); - return -1; - } + return qemudSecurityCapsInit(security_drv, qemud_drv->caps); +} - caps->host.secModel.doi = strdup(doi); - if (!caps->host.secModel.doi) { - char ebuf[1024]; - VIR_ERROR(_("Failed to copy secModel DOI: %s"), - virStrerror(errno, ebuf, sizeof ebuf)); - return -1; - } - return 0; -} /** * qemudStartup: @@ -1866,13 +1878,29 @@ static int qemudGetMaxVCPUs(virConnectPt static char *qemudGetCapabilities(virConnectPtr conn) { struct qemud_driver *driver = conn->privateData; + virCapsPtr caps; char *xml = NULL; qemuDriverLock(driver); + if ((caps = qemudCapsInit()) == NULL) { + virReportOOMError(conn); + goto cleanup; + } + + if (qemu_driver->securityDriver && + qemudSecurityCapsInit(qemu_driver->securityDriver, caps) < 0) { + virCapabilitiesFree(caps); + virReportOOMError(conn); + goto cleanup; + } + virCapabilitiesFree(qemu_driver->caps); - if ((qemu_driver->caps = qemudCapsInit()) == NULL || - (xml = virCapabilitiesFormatXML(driver->caps)) == NULL) + qemu_driver->caps = caps; + + if ((xml = virCapabilitiesFormatXML(driver->caps)) == NULL) virReportOOMError(conn); + +cleanup: qemuDriverUnlock(driver); return xml; -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list