[libvirt] [PATCH] qemu: avoid NULL derefs
Daniel Veillard
veillard at redhat.com
Tue Feb 15 03:26:10 UTC 2011
On Mon, Feb 14, 2011 at 04:59:39PM -0700, Eric Blake wrote:
> The processWatchdogEvent fix is real, although it can only trigger on
> OOM, since bad things happen if doCoreDump is called with a NULL
> pathname argument. The other fixes silence clang, but aren't a real
> bug because virReportErrorHelper tolerates a NULL format string even
> though *printf does not.
>
> * src/qemu/qemu_driver.c (processWatchdogEvent): Exit on OOM.
> (qemuDomainIsActive, qemuDomainIsPersistent, qemuDomainIsUpdated):
> Provide valid message.
> ---
>
> Another valid clang finding. Maybe we whould mark
> virReportErrorHelper as ATTRIBUTE_NONNULL for the format string
> argument, and require all clients to pass in a valid error string
> (after all, that's what the printf attritube already assumes, and
> passing NULL just means that we aren't giving back any useful error
> information to the user); but that can be a separate cleanup.
>
> src/qemu/qemu_driver.c | 23 +++++++++++++++++------
> 1 files changed, 17 insertions(+), 6 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index c581cfe..82a2210 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -3489,7 +3489,10 @@ static int qemuDomainIsActive(virDomainPtr dom)
> obj = virDomainFindByUUID(&driver->domains, dom->uuid);
> qemuDriverUnlock(driver);
> if (!obj) {
> - qemuReportError(VIR_ERR_NO_DOMAIN, NULL);
> + char uuidstr[VIR_UUID_STRING_BUFLEN];
> + virUUIDFormat(dom->uuid, uuidstr);
> + qemuReportError(VIR_ERR_NO_DOMAIN,
> + _("no domain with matching uuid '%s'"), uuidstr);
> goto cleanup;
> }
> ret = virDomainObjIsActive(obj);
> @@ -3510,7 +3513,10 @@ static int qemuDomainIsPersistent(virDomainPtr dom)
> obj = virDomainFindByUUID(&driver->domains, dom->uuid);
> qemuDriverUnlock(driver);
> if (!obj) {
> - qemuReportError(VIR_ERR_NO_DOMAIN, NULL);
> + char uuidstr[VIR_UUID_STRING_BUFLEN];
> + virUUIDFormat(dom->uuid, uuidstr);
> + qemuReportError(VIR_ERR_NO_DOMAIN,
> + _("no domain with matching uuid '%s'"), uuidstr);
> goto cleanup;
> }
> ret = obj->persistent;
> @@ -3531,7 +3537,10 @@ static int qemuDomainIsUpdated(virDomainPtr dom)
> obj = virDomainFindByUUID(&driver->domains, dom->uuid);
> qemuDriverUnlock(driver);
> if (!obj) {
> - qemuReportError(VIR_ERR_NO_DOMAIN, NULL);
> + char uuidstr[VIR_UUID_STRING_BUFLEN];
> + virUUIDFormat(dom->uuid, uuidstr);
> + qemuReportError(VIR_ERR_NO_DOMAIN,
> + _("no domain with matching uuid '%s'"), uuidstr);
> goto cleanup;
> }
> ret = obj->updated;
> @@ -4981,12 +4990,14 @@ static void processWatchdogEvent(void *data, void *opaque)
> case VIR_DOMAIN_WATCHDOG_ACTION_DUMP:
> {
> char *dumpfile;
> - int i;
>
> - i = virAsprintf(&dumpfile, "%s/%s-%u",
> + if (virAsprintf(&dumpfile, "%s/%s-%u",
> driver->autoDumpPath,
> wdEvent->vm->def->name,
> - (unsigned int)time(NULL));
> + (unsigned int)time(NULL)) < 0) {
> + virReportOOMError();
> + break;
> + }
>
> qemuDriverLock(driver);
> virDomainObjLock(wdEvent->vm);
ACK, fine pushing now,
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