[libvirt] [PATCH] domain controller index check
Ján Tomko
jtomko at redhat.com
Mon Jul 8 15:04:19 UTC 2013
On 07/08/2013 02:08 PM, jmiao at redhat.com wrote:
> From: Jincheng Miao <jmiao at redhat.com>
>
> The index of the controller should not be less than zero.
> So use virStrToLong_ui() to check the controller index in
> virDomainControllerDefParseXML().
> ---
> src/conf/domain_conf.c | 2 +-
> src/conf/domain_conf.h | 2 +-
> src/qemu/qemu_command.c | 2 +-
> src/vmx/vmx.c | 3 +--
> 4 files changed, 4 insertions(+), 5 deletions(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 402e6e9..2831edf 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -5593,7 +5593,7 @@ virDomainControllerDefParseXML(xmlNodePtr node,
>
> idx = virXMLPropString(node, "index");
> if (idx) {
> - if (virStrToLong_i(idx, NULL, 10, &def->idx) < 0) {
> + if (virStrToLong_ui(idx, NULL, 10, &def->idx) < 0) {
> virReportError(VIR_ERR_INTERNAL_ERROR,
> _("Cannot parse controller index %s"), idx);
> goto error;
I wonder if we should forbid values larger than INT_MAX as well, since
virDomainDefRejectDuplicateControllers uses -1 as 'no controllers' and
qemuDomainAssignPCIAddresses uses it for 'no PCI buses'.
If it overflowed, this could result in some weird errors (but that many PCI
bridges wouldn't be usable anyway).
Jan
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index da83eb6..7897b4b 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -790,7 +790,7 @@ struct _virDomainVirtioSerialOpts {
> /* Stores the virtual disk controller configuration */
> struct _virDomainControllerDef {
> int type;
> - int idx;
> + unsigned int idx;
> int model; /* -1 == undef */
> unsigned int queues;
> union {
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 46db28a..7fd1cbf 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -1585,7 +1585,7 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def,
>
> for (i = 0; i < def->ncontrollers; i++) {
> if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) {
> - if (def->controllers[i]->idx > max_idx)
> + if ((int)def->controllers[i]->idx > max_idx)
> max_idx = def->controllers[i]->idx;
> }
> }
> diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c
> index 5464d13..deddfaa 100644
> --- a/src/vmx/vmx.c
> +++ b/src/vmx/vmx.c
> @@ -1664,8 +1664,7 @@ virVMXParseConfig(virVMXContext *ctx,
>
> for (controller = 0; controller < def->ncontrollers; ++controller) {
> if (def->controllers[controller]->type == VIR_DOMAIN_CONTROLLER_TYPE_SCSI) {
> - if (def->controllers[controller]->idx < 0 ||
> - def->controllers[controller]->idx > 3) {
> + if (def->controllers[controller]->idx > 3) {
> virReportError(VIR_ERR_INTERNAL_ERROR,
> _("SCSI controller index %d out of [0..3] range"),
> def->controllers[controller]->idx);
>
More information about the libvir-list
mailing list