[libvirt] [PATCH 5/5] xen: allow getting < max typed parameters

Stefan Berger stefanb at linux.vnet.ibm.com
Wed Nov 2 18:53:50 UTC 2011


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




More information about the libvir-list mailing list