[libvirt] [PATCH 0/5] more virTypedParameter cleanup

Following in the wake of my qemu cleanup [1], I figured it was worth fixing the other drivers as well. Let me know if I should squash this into one patch instead of 5. [1] https://www.redhat.com/archives/libvir-list/2011-November/msg00055.html Eric Blake (5): esx: allow getting < max typed parameters libxl: allow getting < max typed parameters lxc: allow getting < max typed parameters test: drop redundant check xen: allow getting < max typed parameters src/esx/esx_driver.c | 14 +------------- src/libxl/libxl_driver.c | 22 ++++++++++------------ src/lxc/lxc_driver.c | 16 +++------------- src/test/test_driver.c | 4 ---- src/xen/xen_hypervisor.c | 26 ++++++++++++-------------- src/xen/xend_internal.c | 28 +++++++++++++--------------- 6 files changed, 39 insertions(+), 71 deletions(-) -- 1.7.4.4

Allow the user to call with nparams too small, per API documentation. * src/esx/esx_driver.c (esxDomainGetMemoryParameters): Drop redundant check. (esxDomainGetSchedulerParametersFlags): Allow fewer than max. --- src/esx/esx_driver.c | 14 +------------- 1 files changed, 1 insertions(+), 13 deletions(-) diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c index 7cff9c2..92b56d8 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -3635,12 +3635,6 @@ esxDomainGetSchedulerParametersFlags(virDomainPtr domain, virCheckFlags(0, -1); - if (*nparams < 3) { - ESX_ERROR(VIR_ERR_INVALID_ARG, "%s", - _("Parameter array must have space for 3 items")); - return -1; - } - if (esxVI_EnsureSession(priv->primary) < 0) { return -1; } @@ -3656,7 +3650,7 @@ esxDomainGetSchedulerParametersFlags(virDomainPtr domain, } for (dynamicProperty = virtualMachine->propSet; - dynamicProperty != NULL && mask != 7 && i < 3; + dynamicProperty != NULL && mask != 7 && i < 3 && i < *nparams; dynamicProperty = dynamicProperty->_next) { if (STREQ(dynamicProperty->name, "config.cpuAllocation.reservation") && ! (mask & (1 << 0))) { @@ -4886,12 +4880,6 @@ esxDomainGetMemoryParameters(virDomainPtr domain, virTypedParameterPtr params, return 0; } - if (*nparams < 1) { - ESX_ERROR(VIR_ERR_INVALID_ARG, "%s", - _("Parameter array must have space for 1 item")); - return -1; - } - if (esxVI_EnsureSession(priv->primary) < 0) { return -1; } -- 1.7.4.4

On 11/02/2011 02:00 PM, Eric Blake wrote:
Allow the user to call with nparams too small, per API documentation.
* src/esx/esx_driver.c (esxDomainGetMemoryParameters): Drop redundant check. (esxDomainGetSchedulerParametersFlags): Allow fewer than max. --- src/esx/esx_driver.c | 14 +------------- 1 files changed, 1 insertions(+), 13 deletions(-)
diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c index 7cff9c2..92b56d8 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -3635,12 +3635,6 @@ esxDomainGetSchedulerParametersFlags(virDomainPtr domain,
virCheckFlags(0, -1);
- if (*nparams< 3) { - ESX_ERROR(VIR_ERR_INVALID_ARG, "%s", - _("Parameter array must have space for 3 items")); - return -1; - } - if (esxVI_EnsureSession(priv->primary)< 0) { return -1; } @@ -3656,7 +3650,7 @@ esxDomainGetSchedulerParametersFlags(virDomainPtr domain, }
for (dynamicProperty = virtualMachine->propSet; - dynamicProperty != NULL&& mask != 7&& i< 3; + dynamicProperty != NULL&& mask != 7&& i< 3&& i< *nparams; dynamicProperty = dynamicProperty->_next) { if (STREQ(dynamicProperty->name, "config.cpuAllocation.reservation")&& ! (mask& (1<< 0))) { @@ -4886,12 +4880,6 @@ esxDomainGetMemoryParameters(virDomainPtr domain, virTypedParameterPtr params, return 0; }
- if (*nparams< 1) { - ESX_ERROR(VIR_ERR_INVALID_ARG, "%s", - _("Parameter array must have space for 1 item")); - return -1; - } - if (esxVI_EnsureSession(priv->primary)< 0) { return -1; } ACK

Allow the user to call with nparams too small, per API documentation. * src/libxl/libxl_driver.c (libxlDomainGetSchedulerParametersFlags): Allow fewer than max. --- src/libxl/libxl_driver.c | 22 ++++++++++------------ 1 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index d324632..06dfe0a 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -3631,11 +3631,6 @@ libxlDomainGetSchedulerParametersFlags(virDomainPtr dom, goto cleanup; } - if (*nparams < XEN_SCHED_CREDIT_NPARAM) { - libxlError(VIR_ERR_INVALID_ARG, "%s", _("Invalid parameter count")); - goto cleanup; - } - if (libxl_sched_credit_domain_get(&priv->ctx, dom->id, &sc_info) != 0) { libxlError(VIR_ERR_INTERNAL_ERROR, _("Failed to get scheduler parameters for domain '%d'" @@ -3651,15 +3646,18 @@ libxlDomainGetSchedulerParametersFlags(virDomainPtr dom, goto cleanup; } - params[1].value.ui = sc_info.cap; - params[1].type = VIR_TYPED_PARAM_UINT; - if (virStrcpyStatic(params[1].field, "cap") == NULL) { - libxlError(VIR_ERR_INTERNAL_ERROR, - "%s", _("Field cap too long for destination")); - goto cleanup; + if (*nparams > 1) { + params[1].value.ui = sc_info.cap; + params[1].type = VIR_TYPED_PARAM_UINT; + if (virStrcpyStatic(params[1].field, "cap") == NULL) { + libxlError(VIR_ERR_INTERNAL_ERROR, + "%s", _("Field cap too long for destination")); + goto cleanup; + } } - *nparams = XEN_SCHED_CREDIT_NPARAM; + if (*nparams > XEN_SCHED_CREDIT_NPARAM) + *nparams = XEN_SCHED_CREDIT_NPARAM; ret = 0; cleanup: -- 1.7.4.4

On 11/02/2011 02:00 PM, Eric Blake wrote:
Allow the user to call with nparams too small, per API documentation.
* src/libxl/libxl_driver.c (libxlDomainGetSchedulerParametersFlags): Allow fewer than max. --- src/libxl/libxl_driver.c | 22 ++++++++++------------ 1 files changed, 10 insertions(+), 12 deletions(-)
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index d324632..06dfe0a 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -3631,11 +3631,6 @@ libxlDomainGetSchedulerParametersFlags(virDomainPtr dom, goto cleanup; }
- if (*nparams< XEN_SCHED_CREDIT_NPARAM) { - libxlError(VIR_ERR_INVALID_ARG, "%s", _("Invalid parameter count")); - goto cleanup; - } - if (libxl_sched_credit_domain_get(&priv->ctx, dom->id,&sc_info) != 0) { libxlError(VIR_ERR_INTERNAL_ERROR, _("Failed to get scheduler parameters for domain '%d'" @@ -3651,15 +3646,18 @@ libxlDomainGetSchedulerParametersFlags(virDomainPtr dom, goto cleanup; }
- params[1].value.ui = sc_info.cap; - params[1].type = VIR_TYPED_PARAM_UINT; - if (virStrcpyStatic(params[1].field, "cap") == NULL) { - libxlError(VIR_ERR_INTERNAL_ERROR, - "%s", _("Field cap too long for destination")); - goto cleanup; + if (*nparams> 1) { + params[1].value.ui = sc_info.cap; + params[1].type = VIR_TYPED_PARAM_UINT; + if (virStrcpyStatic(params[1].field, "cap") == NULL) { I remember this one here:
+ libxlError(VIR_ERR_INTERNAL_ERROR, + "%s", _("Field cap too long for destination")); Also, would it be worth doing the same here as you did in the other
VIR_DOMAIN_SCHEDULER_CAP Is this the same one ? If so, maybe you want to replace it. patches using "%s" in place of 'cap'?
+ goto cleanup; + } }
- *nparams = XEN_SCHED_CREDIT_NPARAM; + if (*nparams> XEN_SCHED_CREDIT_NPARAM) + *nparams = XEN_SCHED_CREDIT_NPARAM; ret = 0;
cleanup:

On 11/02/2011 12:35 PM, Stefan Berger wrote:
On 11/02/2011 02:00 PM, Eric Blake wrote:
Allow the user to call with nparams too small, per API documentation.
+ if (virStrcpyStatic(params[1].field, "cap") == NULL) { I remember this one here:
VIR_DOMAIN_SCHEDULER_CAP
Is this the same one ? If so, maybe you want to replace it.
Good catch, and yes, I'll squash that fix into my earlier patch on naming the parameters. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

Allow the user to call with nparams too small, per API documentation. Also, libvirt.c filters out nparams of 0 for scheduler parameters. * src/lxc/lxc_driver.c (lxcDomainGetMemoryParameters): Allow fewer than max. (lxcGetSchedulerParametersFlags): Drop redundant check. --- src/lxc/lxc_driver.c | 16 +++------------- 1 files changed, 3 insertions(+), 13 deletions(-) diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 9c89c41..4096626 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -901,11 +901,6 @@ static int lxcDomainGetMemoryParameters(virDomainPtr dom, ret = 0; goto cleanup; } - if ((*nparams) < LXC_NB_MEM_PARAM) { - lxcError(VIR_ERR_INVALID_ARG, - "%s", _("Invalid parameter count")); - goto cleanup; - } if (virCgroupForDomain(driver->cgroup, vm->def->name, &cgroup, 0) != 0) { lxcError(VIR_ERR_INTERNAL_ERROR, @@ -913,7 +908,7 @@ static int lxcDomainGetMemoryParameters(virDomainPtr dom, goto cleanup; } - for (i = 0; i < LXC_NB_MEM_PARAM; i++) { + for (i = 0; i < LXC_NB_MEM_PARAM && i < *nparams; i++) { virTypedParameterPtr param = ¶ms[i]; val = 0; param->value.ul = 0; @@ -971,7 +966,8 @@ static int lxcDomainGetMemoryParameters(virDomainPtr dom, } } - *nparams = LXC_NB_MEM_PARAM; + if (*nparams > LXC_NB_MEM_PARAM) + *nparams = LXC_NB_MEM_PARAM; ret = 0; cleanup: @@ -2580,12 +2576,6 @@ lxcGetSchedulerParametersFlags(virDomainPtr domain, if (driver->cgroup == NULL) return -1; - if (*nparams < 1) { - lxcError(VIR_ERR_INVALID_ARG, - "%s", _("Invalid parameter count")); - return -1; - } - lxcDriverLock(driver); vm = virDomainFindByUUID(&driver->domains, domain->uuid); -- 1.7.4.4

On 11/02/2011 02:00 PM, Eric Blake wrote:
Allow the user to call with nparams too small, per API documentation. Also, libvirt.c filters out nparams of 0 for scheduler parameters.
* src/lxc/lxc_driver.c (lxcDomainGetMemoryParameters): Allow fewer than max. (lxcGetSchedulerParametersFlags): Drop redundant check. --- src/lxc/lxc_driver.c | 16 +++------------- 1 files changed, 3 insertions(+), 13 deletions(-)
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 9c89c41..4096626 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -901,11 +901,6 @@ static int lxcDomainGetMemoryParameters(virDomainPtr dom, ret = 0; goto cleanup; } - if ((*nparams)< LXC_NB_MEM_PARAM) { - lxcError(VIR_ERR_INVALID_ARG, - "%s", _("Invalid parameter count")); - goto cleanup; - }
if (virCgroupForDomain(driver->cgroup, vm->def->name,&cgroup, 0) != 0) { lxcError(VIR_ERR_INTERNAL_ERROR, @@ -913,7 +908,7 @@ static int lxcDomainGetMemoryParameters(virDomainPtr dom, goto cleanup; }
- for (i = 0; i< LXC_NB_MEM_PARAM; i++) { + for (i = 0; i< LXC_NB_MEM_PARAM&& i< *nparams; i++) { virTypedParameterPtr param =¶ms[i]; val = 0; param->value.ul = 0; @@ -971,7 +966,8 @@ static int lxcDomainGetMemoryParameters(virDomainPtr dom, } }
- *nparams = LXC_NB_MEM_PARAM; + if (*nparams> LXC_NB_MEM_PARAM) + *nparams = LXC_NB_MEM_PARAM; OK. Caps number of returned parameters to '3'. ret = 0;
cleanup: @@ -2580,12 +2576,6 @@ lxcGetSchedulerParametersFlags(virDomainPtr domain, if (driver->cgroup == NULL) return -1;
- if (*nparams< 1) { - lxcError(VIR_ERR_INVALID_ARG, - "%s", _("Invalid parameter count")); - return -1; - } - Ok with number of schedule parameters not being zero. lxcDriverLock(driver); vm = virDomainFindByUUID(&driver->domains, domain->uuid);
ACK

libvirt.c guarantees that nparams is non-zero for scheduler parameters. * src/test/test_driver.c (testDomainGetSchedulerParamsFlags): Drop redundant check. --- src/test/test_driver.c | 4 ---- 1 files changed, 0 insertions(+), 4 deletions(-) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 4e1973a..de0f716 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -2709,10 +2709,6 @@ testDomainGetSchedulerParamsFlags(virDomainPtr domain, goto cleanup; } - if (*nparams < 1) { - testError(VIR_ERR_INVALID_ARG, "%s", _("Invalid parameter count")); - goto cleanup; - } strcpy(params[0].field, VIR_DOMAIN_SCHEDULER_WEIGHT); params[0].type = VIR_TYPED_PARAM_UINT; /* XXX */ -- 1.7.4.4

libvirt.c guarantees that nparams is non-zero for scheduler parameters.
* src/test/test_driver.c (testDomainGetSchedulerParamsFlags): Drop redundant check. --- src/test/test_driver.c | 4 ---- 1 files changed, 0 insertions(+), 4 deletions(-)
diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 4e1973a..de0f716 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -2709,10 +2709,6 @@ testDomainGetSchedulerParamsFlags(virDomainPtr domain, goto cleanup; }
- if (*nparams< 1) { - testError(VIR_ERR_INVALID_ARG, "%s", _("Invalid parameter count")); - goto cleanup; - } Following the note on the top of this mail, this seems not even to be
On 11/02/2011 02:00 PM, Eric Blake wrote: possible (and hopefully never will be).
strcpy(params[0].field, VIR_DOMAIN_SCHEDULER_WEIGHT);
Someone is still using strcpy!
params[0].type = VIR_TYPED_PARAM_UINT; /* XXX */
ACK

On 11/02/2011 12:42 PM, Stefan Berger wrote:
libvirt.c guarantees that nparams is non-zero for scheduler parameters.
* src/test/test_driver.c (testDomainGetSchedulerParamsFlags): Drop redundant check. --- src/test/test_driver.c | 4 ---- 1 files changed, 0 insertions(+), 4 deletions(-)
diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 4e1973a..de0f716 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -2709,10 +2709,6 @@ testDomainGetSchedulerParamsFlags(virDomainPtr domain, goto cleanup; }
- if (*nparams< 1) { - testError(VIR_ERR_INVALID_ARG, "%s", _("Invalid parameter count")); - goto cleanup; - } Following the note on the top of this mail, this seems not even to be
On 11/02/2011 02:00 PM, Eric Blake wrote: possible (and hopefully never will be).
My recent commit 5465bc0 included explicit documentation in libvirt.c that nparams can't be zero on virDomainGetSchedulerParams, fairly close to the actual code in that file that guarantees that condition before calling any driver callback.
strcpy(params[0].field, VIR_DOMAIN_SCHEDULER_WEIGHT); Someone is still using strcpy!
At least this use was safe. But I went ahead and converted that to virStrcpyStatic.
params[0].type = VIR_TYPED_PARAM_UINT; /* XXX */ ACK
I've gone ahead and pushed this series. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

Allow the user to call with nparams too small, per API documentation. * src/xen/xen_hypervisor.c (xenHypervisorGetSchedulerParameters): Allow fewer than max. * src/xen/xend_internal.c (xenDaemonGetSchedulerParameters): Likewise. --- src/xen/xen_hypervisor.c | 26 ++++++++++++-------------- src/xen/xend_internal.c | 28 +++++++++++++--------------- 2 files changed, 25 insertions(+), 29 deletions(-) diff --git a/src/xen/xen_hypervisor.c b/src/xen/xen_hypervisor.c index f1a8e68..634b23b 100644 --- a/src/xen/xen_hypervisor.c +++ b/src/xen/xen_hypervisor.c @@ -1274,11 +1274,6 @@ xenHypervisorGetSchedulerParameters(virDomainPtr domain, TODO return(-1); case XEN_SCHEDULER_CREDIT: - if (*nparams < XEN_SCHED_CRED_NPARAM) { - virXenError(VIR_ERR_INVALID_ARG, - "%s", _("Invalid parameter count")); - return -1; - } memset(&op_dom, 0, sizeof(op_dom)); op_dom.cmd = XEN_V2_OP_SCHEDULER; op_dom.domain = (domid_t) domain->id; @@ -1298,17 +1293,20 @@ xenHypervisorGetSchedulerParameters(virDomainPtr domain, params[0].type = VIR_TYPED_PARAM_UINT; params[0].value.ui = op_dom.u.getschedinfo.u.credit.weight; - if (virStrcpyStatic(params[1].field, - VIR_DOMAIN_SCHEDULER_CAP) == NULL) { - virXenError(VIR_ERR_INTERNAL_ERROR, - "Cap %s too big for destination", - VIR_DOMAIN_SCHEDULER_CAP); - return -1; + if (*nparams > 1) { + if (virStrcpyStatic(params[1].field, + VIR_DOMAIN_SCHEDULER_CAP) == NULL) { + virXenError(VIR_ERR_INTERNAL_ERROR, + "Cap %s too big for destination", + VIR_DOMAIN_SCHEDULER_CAP); + return -1; + } + params[1].type = VIR_TYPED_PARAM_UINT; + params[1].value.ui = op_dom.u.getschedinfo.u.credit.cap; } - params[1].type = VIR_TYPED_PARAM_UINT; - params[1].value.ui = op_dom.u.getschedinfo.u.credit.cap; - *nparams = XEN_SCHED_CRED_NPARAM; + if (*nparams > XEN_SCHED_CRED_NPARAM) + *nparams = XEN_SCHED_CRED_NPARAM; break; default: virXenErrorFunc(VIR_ERR_INVALID_ARG, __FUNCTION__, diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c index 4fcc628..80a2472 100644 --- a/src/xen/xend_internal.c +++ b/src/xen/xend_internal.c @@ -3614,12 +3614,6 @@ xenDaemonGetSchedulerParameters(virDomainPtr domain, TODO goto error; case XEN_SCHED_CRED_NPARAM: - if (*nparams < XEN_SCHED_CRED_NPARAM) { - virXendError(VIR_ERR_INVALID_ARG, - "%s", _("Invalid parameter count")); - goto error; - } - /* get cpu_weight/cpu_cap from xend/domain */ if (sexpr_node(root, "domain/cpu_weight") == NULL) { virXendError(VIR_ERR_INTERNAL_ERROR, @@ -3642,16 +3636,20 @@ xenDaemonGetSchedulerParameters(virDomainPtr domain, params[0].type = VIR_TYPED_PARAM_UINT; params[0].value.ui = sexpr_int(root, "domain/cpu_weight"); - if (virStrcpyStatic(params[1].field, - VIR_DOMAIN_SCHEDULER_CAP) == NULL) { - virXendError(VIR_ERR_INTERNAL_ERROR, - _("Cap %s too big for destination"), - VIR_DOMAIN_SCHEDULER_CAP); - goto error; + if (*nparams > 1) { + if (virStrcpyStatic(params[1].field, + VIR_DOMAIN_SCHEDULER_CAP) == NULL) { + virXendError(VIR_ERR_INTERNAL_ERROR, + _("Cap %s too big for destination"), + VIR_DOMAIN_SCHEDULER_CAP); + goto error; + } + params[1].type = VIR_TYPED_PARAM_UINT; + params[1].value.ui = sexpr_int(root, "domain/cpu_cap"); } - params[1].type = VIR_TYPED_PARAM_UINT; - params[1].value.ui = sexpr_int(root, "domain/cpu_cap"); - *nparams = XEN_SCHED_CRED_NPARAM; + + if (*nparams > XEN_SCHED_CRED_NPARAM) + *nparams = XEN_SCHED_CRED_NPARAM; ret = 0; break; default: -- 1.7.4.4

On 11/02/2011 02:00 PM, Eric Blake wrote:
Allow the user to call with nparams too small, per API documentation.
* src/xen/xen_hypervisor.c (xenHypervisorGetSchedulerParameters): Allow fewer than max. * src/xen/xend_internal.c (xenDaemonGetSchedulerParameters): Likewise. --- src/xen/xen_hypervisor.c | 26 ++++++++++++-------------- src/xen/xend_internal.c | 28 +++++++++++++--------------- 2 files changed, 25 insertions(+), 29 deletions(-)
diff --git a/src/xen/xen_hypervisor.c b/src/xen/xen_hypervisor.c index f1a8e68..634b23b 100644 --- a/src/xen/xen_hypervisor.c +++ b/src/xen/xen_hypervisor.c @@ -1274,11 +1274,6 @@ xenHypervisorGetSchedulerParameters(virDomainPtr domain, TODO return(-1); case XEN_SCHEDULER_CREDIT: - if (*nparams< XEN_SCHED_CRED_NPARAM) { - virXenError(VIR_ERR_INVALID_ARG, - "%s", _("Invalid parameter count")); - return -1; - } memset(&op_dom, 0, sizeof(op_dom)); op_dom.cmd = XEN_V2_OP_SCHEDULER; op_dom.domain = (domid_t) domain->id; @@ -1298,17 +1293,20 @@ xenHypervisorGetSchedulerParameters(virDomainPtr domain, params[0].type = VIR_TYPED_PARAM_UINT; params[0].value.ui = op_dom.u.getschedinfo.u.credit.weight;
Again assuming *nparams always >= 1, ok.
- if (virStrcpyStatic(params[1].field, - VIR_DOMAIN_SCHEDULER_CAP) == NULL) { - virXenError(VIR_ERR_INTERNAL_ERROR, - "Cap %s too big for destination", - VIR_DOMAIN_SCHEDULER_CAP); - return -1; + if (*nparams> 1) { + if (virStrcpyStatic(params[1].field, + VIR_DOMAIN_SCHEDULER_CAP) == NULL) { + virXenError(VIR_ERR_INTERNAL_ERROR, + "Cap %s too big for destination", + VIR_DOMAIN_SCHEDULER_CAP); + return -1; + } + params[1].type = VIR_TYPED_PARAM_UINT; + params[1].value.ui = op_dom.u.getschedinfo.u.credit.cap; } - params[1].type = VIR_TYPED_PARAM_UINT; - params[1].value.ui = op_dom.u.getschedinfo.u.credit.cap;
- *nparams = XEN_SCHED_CRED_NPARAM; + if (*nparams> XEN_SCHED_CRED_NPARAM) + *nparams = XEN_SCHED_CRED_NPARAM; break; default: virXenErrorFunc(VIR_ERR_INVALID_ARG, __FUNCTION__, diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c index 4fcc628..80a2472 100644 --- a/src/xen/xend_internal.c +++ b/src/xen/xend_internal.c @@ -3614,12 +3614,6 @@ xenDaemonGetSchedulerParameters(virDomainPtr domain, TODO goto error; case XEN_SCHED_CRED_NPARAM: - if (*nparams< XEN_SCHED_CRED_NPARAM) { - virXendError(VIR_ERR_INVALID_ARG, - "%s", _("Invalid parameter count")); - goto error; - } - /* get cpu_weight/cpu_cap from xend/domain */ if (sexpr_node(root, "domain/cpu_weight") == NULL) { virXendError(VIR_ERR_INTERNAL_ERROR, @@ -3642,16 +3636,20 @@ xenDaemonGetSchedulerParameters(virDomainPtr domain, params[0].type = VIR_TYPED_PARAM_UINT; params[0].value.ui = sexpr_int(root, "domain/cpu_weight");
same as above
- if (virStrcpyStatic(params[1].field, - VIR_DOMAIN_SCHEDULER_CAP) == NULL) { - virXendError(VIR_ERR_INTERNAL_ERROR, - _("Cap %s too big for destination"), - VIR_DOMAIN_SCHEDULER_CAP); - goto error; + if (*nparams> 1) { + if (virStrcpyStatic(params[1].field, + VIR_DOMAIN_SCHEDULER_CAP) == NULL) { + virXendError(VIR_ERR_INTERNAL_ERROR, + _("Cap %s too big for destination"), + VIR_DOMAIN_SCHEDULER_CAP); + goto error; + } + params[1].type = VIR_TYPED_PARAM_UINT; + params[1].value.ui = sexpr_int(root, "domain/cpu_cap"); } - params[1].type = VIR_TYPED_PARAM_UINT; - params[1].value.ui = sexpr_int(root, "domain/cpu_cap"); - *nparams = XEN_SCHED_CRED_NPARAM; + + if (*nparams> XEN_SCHED_CRED_NPARAM) + *nparams = XEN_SCHED_CRED_NPARAM; ret = 0; break; default: ACK
participants (2)
-
Eric Blake
-
Stefan Berger