conf: Sanitize cpu topology numbers

Make sure that the topology results into a sane number of cpus (up to
UINT_MAX) so that it can be sanely compared to the vcpu count of the VM.

Additionally the helper added in this patch allows to fetch the total
number the topology results to so that it does not have to be
reimplemented later.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1378290
This commit is contained in:
Peter Krempa 2016-10-10 15:46:25 +02:00
parent 6aba53468a
commit da0d82d15f
3 changed files with 42 additions and 0 deletions

View File

@ -1570,6 +1570,42 @@ virDomainDefGetVcpuPinInfoHelper(virDomainDefPtr def,
} }
/**
* virDomainDeGetVcpusTopology:
* @def: domain definition
* @maxvcpus: optionally filled with number of vcpus the domain topology describes
*
* Calculates and validates that the vcpu topology is in sane bounds and
* optionally returns the total number of vcpus described by given topology.
*
* Returns 0 on success, 1 if topology is not configured and -1 on error.
*/
int
virDomainDefGetVcpusTopology(const virDomainDef *def,
unsigned int *maxvcpus)
{
unsigned long long tmp;
if (!def->cpu || def->cpu->sockets == 0)
return 1;
tmp = def->cpu->sockets;
/* multiplication of 32bit numbers fits into a 64bit variable */
if ((tmp *= def->cpu->cores) > UINT_MAX ||
(tmp *= def->cpu->threads) > UINT_MAX) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("cpu topology results in more than %u cpus"), UINT_MAX);
return -1;
}
if (maxvcpus)
*maxvcpus = tmp;
return 0;
}
virDomainDiskDefPtr virDomainDiskDefPtr
virDomainDiskDefNew(virDomainXMLOptionPtr xmlopt) virDomainDiskDefNew(virDomainXMLOptionPtr xmlopt)
{ {
@ -4786,6 +4822,9 @@ virDomainDefValidateInternal(const virDomainDef *def)
if (virDomainDefCheckDuplicateDiskInfo(def) < 0) if (virDomainDefCheckDuplicateDiskInfo(def) < 0)
return -1; return -1;
if (virDomainDefGetVcpusTopology(def, NULL) < 0)
return -1;
return 0; return 0;
} }

View File

@ -2488,6 +2488,8 @@ virBitmapPtr virDomainDefGetOnlineVcpumap(const virDomainDef *def);
virDomainVcpuDefPtr virDomainDefGetVcpu(virDomainDefPtr def, unsigned int vcpu) virDomainVcpuDefPtr virDomainDefGetVcpu(virDomainDefPtr def, unsigned int vcpu)
ATTRIBUTE_RETURN_CHECK; ATTRIBUTE_RETURN_CHECK;
void virDomainDefVcpuOrderClear(virDomainDefPtr def); void virDomainDefVcpuOrderClear(virDomainDefPtr def);
int virDomainDefGetVcpusTopology(const virDomainDef *def,
unsigned int *maxvcpus);
virDomainObjPtr virDomainObjNew(virDomainXMLOptionPtr caps) virDomainObjPtr virDomainObjNew(virDomainXMLOptionPtr caps)
ATTRIBUTE_NONNULL(1); ATTRIBUTE_NONNULL(1);

View File

@ -247,6 +247,7 @@ virDomainDefGetVcpu;
virDomainDefGetVcpuPinInfoHelper; virDomainDefGetVcpuPinInfoHelper;
virDomainDefGetVcpus; virDomainDefGetVcpus;
virDomainDefGetVcpusMax; virDomainDefGetVcpusMax;
virDomainDefGetVcpusTopology;
virDomainDefHasDeviceAddress; virDomainDefHasDeviceAddress;
virDomainDefHasMemballoon; virDomainDefHasMemballoon;
virDomainDefHasMemoryHotplug; virDomainDefHasMemoryHotplug;