提交 abaa6560 编写于 作者: E Eric Blake

qemu: avoid NULL derefs

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.
上级 ae891f95
...@@ -3489,7 +3489,10 @@ static int qemuDomainIsActive(virDomainPtr dom) ...@@ -3489,7 +3489,10 @@ static int qemuDomainIsActive(virDomainPtr dom)
obj = virDomainFindByUUID(&driver->domains, dom->uuid); obj = virDomainFindByUUID(&driver->domains, dom->uuid);
qemuDriverUnlock(driver); qemuDriverUnlock(driver);
if (!obj) { 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; goto cleanup;
} }
ret = virDomainObjIsActive(obj); ret = virDomainObjIsActive(obj);
...@@ -3510,7 +3513,10 @@ static int qemuDomainIsPersistent(virDomainPtr dom) ...@@ -3510,7 +3513,10 @@ static int qemuDomainIsPersistent(virDomainPtr dom)
obj = virDomainFindByUUID(&driver->domains, dom->uuid); obj = virDomainFindByUUID(&driver->domains, dom->uuid);
qemuDriverUnlock(driver); qemuDriverUnlock(driver);
if (!obj) { 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; goto cleanup;
} }
ret = obj->persistent; ret = obj->persistent;
...@@ -3531,7 +3537,10 @@ static int qemuDomainIsUpdated(virDomainPtr dom) ...@@ -3531,7 +3537,10 @@ static int qemuDomainIsUpdated(virDomainPtr dom)
obj = virDomainFindByUUID(&driver->domains, dom->uuid); obj = virDomainFindByUUID(&driver->domains, dom->uuid);
qemuDriverUnlock(driver); qemuDriverUnlock(driver);
if (!obj) { 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; goto cleanup;
} }
ret = obj->updated; ret = obj->updated;
...@@ -4981,12 +4990,14 @@ static void processWatchdogEvent(void *data, void *opaque) ...@@ -4981,12 +4990,14 @@ static void processWatchdogEvent(void *data, void *opaque)
case VIR_DOMAIN_WATCHDOG_ACTION_DUMP: case VIR_DOMAIN_WATCHDOG_ACTION_DUMP:
{ {
char *dumpfile; char *dumpfile;
int i;
i = virAsprintf(&dumpfile, "%s/%s-%u", if (virAsprintf(&dumpfile, "%s/%s-%u",
driver->autoDumpPath, driver->autoDumpPath,
wdEvent->vm->def->name, wdEvent->vm->def->name,
(unsigned int)time(NULL)); (unsigned int)time(NULL)) < 0) {
virReportOOMError();
break;
}
qemuDriverLock(driver); qemuDriverLock(driver);
virDomainObjLock(wdEvent->vm); virDomainObjLock(wdEvent->vm);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册