mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-13 00:01:55 +00:00
qemu: Avoid using stale data in virDomainGetBlockInfo
CVE-2013-6458 Generally, every API that is going to begin a job should do that before fetching data from vm->def. However, qemuDomainGetBlockInfo does not know whether it will have to start a job or not before checking vm->def. To avoid using disk alias that might have been freed while we were waiting for a job, we use its copy. In case the disk was removed in the meantime, we will fail with "cannot find statistics for device '...'" error message. (cherry picked from commit b799259583bd65c0b2f5042e6c3ff19637ade881)
This commit is contained in:
parent
c8fa19d9e3
commit
4ee6ed6f50
@ -9707,10 +9707,12 @@ cleanup:
|
||||
}
|
||||
|
||||
|
||||
static int qemuDomainGetBlockInfo(virDomainPtr dom,
|
||||
const char *path,
|
||||
virDomainBlockInfoPtr info,
|
||||
unsigned int flags) {
|
||||
static int
|
||||
qemuDomainGetBlockInfo(virDomainPtr dom,
|
||||
const char *path,
|
||||
virDomainBlockInfoPtr info,
|
||||
unsigned int flags)
|
||||
{
|
||||
virQEMUDriverPtr driver = dom->conn->privateData;
|
||||
virDomainObjPtr vm;
|
||||
int ret = -1;
|
||||
@ -9722,6 +9724,7 @@ static int qemuDomainGetBlockInfo(virDomainPtr dom,
|
||||
int idx;
|
||||
int format;
|
||||
virQEMUDriverConfigPtr cfg = NULL;
|
||||
char *alias = NULL;
|
||||
|
||||
virCheckFlags(0, -1);
|
||||
|
||||
@ -9828,13 +9831,16 @@ static int qemuDomainGetBlockInfo(virDomainPtr dom,
|
||||
virDomainObjIsActive(vm)) {
|
||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||
|
||||
if (VIR_STRDUP(alias, disk->info.alias) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (virDomainObjIsActive(vm)) {
|
||||
qemuDomainObjEnterMonitor(driver, vm);
|
||||
ret = qemuMonitorGetBlockExtent(priv->mon,
|
||||
disk->info.alias,
|
||||
alias,
|
||||
&info->allocation);
|
||||
qemuDomainObjExitMonitor(driver, vm);
|
||||
} else {
|
||||
@ -9848,6 +9854,7 @@ static int qemuDomainGetBlockInfo(virDomainPtr dom,
|
||||
}
|
||||
|
||||
cleanup:
|
||||
VIR_FREE(alias);
|
||||
virStorageFileFreeMetadata(meta);
|
||||
VIR_FORCE_CLOSE(fd);
|
||||
if (vm)
|
||||
|
Loading…
x
Reference in New Issue
Block a user