[libvirt] [PATCH 2/4] remote: Check for limits when encoding typed params
Jonathon Jongsma
jjongsma at redhat.com
Tue Aug 27 15:35:50 UTC 2019
Nice improvement.
Reviewed-by: Jonathon Jongsma <jjongsma at redhat.com>
On Tue, 2019-08-27 at 14:05 +0200, Michal Privoznik wrote:
> The same way we check for limits when decoding typed parameters
> (virTypedParamsDeserialize()) we should do the same check when
> serializing them so that we don't put onto the wire more than our
> limits allow. Surprisingly, we were doing so explicitly in some
> places but not all of them.
>
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
> src/admin/admin_remote.c | 2 ++
> src/admin/admin_server_dispatch.c | 27 ++-------------
> src/remote/remote_daemon_dispatch.c | 54 ++++++++++-----------------
> --
> src/remote/remote_driver.c | 48 ++++---------------------
> src/rpc/gendispatch.pl | 2 ++
> src/util/virtypedparam.c | 13 ++++++-
> src/util/virtypedparam.h | 1 +
> 7 files changed, 45 insertions(+), 102 deletions(-)
>
> diff --git a/src/admin/admin_remote.c b/src/admin/admin_remote.c
> index e112c1f115..0846e72f6d 100644
> --- a/src/admin/admin_remote.c
> +++ b/src/admin/admin_remote.c
> @@ -294,6 +294,7 @@
> remoteAdminServerSetThreadPoolParameters(virAdmServerPtr srv,
> virObjectLock(priv);
>
> if (virTypedParamsSerialize(params, nparams,
> + ADMIN_SERVER_THREADPOOL_PARAMETERS_M
> AX,
> (virTypedParameterRemotePtr *)
> &args.params.params_val,
> &args.params.params_len,
> 0) < 0)
> @@ -405,6 +406,7 @@ remoteAdminServerSetClientLimits(virAdmServerPtr
> srv,
> virObjectLock(priv);
>
> if (virTypedParamsSerialize(params, nparams,
> + ADMIN_SERVER_CLIENT_LIMITS_MAX,
> (virTypedParameterRemotePtr *)
> &args.params.params_val,
> &args.params.params_len,
> 0) < 0)
> diff --git a/src/admin/admin_server_dispatch.c
> b/src/admin/admin_server_dispatch.c
> index 1973664488..3c4d72dedb 100644
> --- a/src/admin/admin_server_dispatch.c
> +++ b/src/admin/admin_server_dispatch.c
> @@ -237,15 +237,8 @@
> adminDispatchServerGetThreadpoolParameters(virNetServerPtr server
> ATTRIBUTE_UNUS
> args->flags) < 0)
> goto cleanup;
>
> - if (nparams > ADMIN_SERVER_THREADPOOL_PARAMETERS_MAX) {
> - virReportError(VIR_ERR_INTERNAL_ERROR,
> - _("Number of threadpool parameters %d exceeds
> max "
> - "allowed limit: %d"), nparams,
> - ADMIN_SERVER_THREADPOOL_PARAMETERS_MAX);
> - goto cleanup;
> - }
> -
> if (virTypedParamsSerialize(params, nparams,
> + ADMIN_SERVER_THREADPOOL_PARAMETERS_M
> AX,
> (virTypedParameterRemotePtr *) &ret-
> >params.params_val,
> &ret->params.params_len, 0) < 0)
> goto cleanup;
> @@ -336,15 +329,8 @@ adminDispatchClientGetInfo(virNetServerPtr
> server ATTRIBUTE_UNUSED,
> if (adminClientGetInfo(clnt, ¶ms, &nparams, args->flags) <
> 0)
> goto cleanup;
>
> - if (nparams > ADMIN_CLIENT_INFO_PARAMETERS_MAX) {
> - virReportError(VIR_ERR_INTERNAL_ERROR,
> - _("Number of client info parameters %d
> exceeds max "
> - "allowed limit: %d"), nparams,
> - ADMIN_CLIENT_INFO_PARAMETERS_MAX);
> - goto cleanup;
> - }
> -
> if (virTypedParamsSerialize(params, nparams,
> + ADMIN_CLIENT_INFO_PARAMETERS_MAX,
> (virTypedParameterRemotePtr *) &ret-
> >params.params_val,
> &ret->params.params_len,
> VIR_TYPED_PARAM_STRING_OKAY) < 0)
> @@ -383,15 +369,8 @@
> adminDispatchServerGetClientLimits(virNetServerPtr server
> ATTRIBUTE_UNUSED,
> if (adminServerGetClientLimits(srv, ¶ms, &nparams, args-
> >flags) < 0)
> goto cleanup;
>
> - if (nparams > ADMIN_SERVER_CLIENT_LIMITS_MAX) {
> - virReportError(VIR_ERR_INTERNAL_ERROR,
> - _("Number of client processing parameters %d
> exceeds "
> - "max allowed limit: %d"), nparams,
> - ADMIN_SERVER_CLIENT_LIMITS_MAX);
> - goto cleanup;
> - }
> -
> if (virTypedParamsSerialize(params, nparams,
> + ADMIN_SERVER_CLIENT_LIMITS_MAX,
> (virTypedParameterRemotePtr *) &ret-
> >params.params_val,
> &ret->params.params_len, 0) < 0)
> goto cleanup;
> diff --git a/src/remote/remote_daemon_dispatch.c
> b/src/remote/remote_daemon_dispatch.c
> index 1a002957ef..e205c743c3 100644
> --- a/src/remote/remote_daemon_dispatch.c
> +++ b/src/remote/remote_daemon_dispatch.c
> @@ -1152,6 +1152,7 @@ remoteRelayDomainEventTunable(virConnectPtr
> conn,
> goto error;
>
> if (virTypedParamsSerialize(params, nparams,
> + REMOTE_DOMAIN_EVENT_TUNABLE_MAX,
> (virTypedParameterRemotePtr *)
> &data.params.params_val,
> &data.params.params_len,
> VIR_TYPED_PARAM_STRING_OKAY) < 0) {
> @@ -1318,6 +1319,7 @@
> remoteRelayDomainEventJobCompleted(virConnectPtr conn,
> goto error;
>
> if (virTypedParamsSerialize(params, nparams,
> + REMOTE_DOMAIN_JOB_STATS_MAX,
> (virTypedParameterRemotePtr *)
> &data.params.params_val,
> &data.params.params_len,
> VIR_TYPED_PARAM_STRING_OKAY) < 0) {
> @@ -2450,6 +2452,7 @@
> remoteDispatchDomainGetSchedulerParameters(virNetServerPtr server
> ATTRIBUTE_UNUS
> goto cleanup;
>
> if (virTypedParamsSerialize(params, nparams,
> + REMOTE_DOMAIN_SCHEDULER_PARAMETERS_M
> AX,
> (virTypedParameterRemotePtr *) &ret-
> >params.params_val,
> &ret->params.params_len,
> 0) < 0)
> @@ -2498,6 +2501,7 @@
> remoteDispatchDomainGetSchedulerParametersFlags(virNetServerPtr
> server ATTRIBUTE
> goto cleanup;
>
> if (virTypedParamsSerialize(params, nparams,
> + REMOTE_DOMAIN_SCHEDULER_PARAMETERS_M
> AX,
> (virTypedParameterRemotePtr *) &ret-
> >params.params_val,
> &ret->params.params_len,
> args->flags) < 0)
> @@ -2663,6 +2667,7 @@
> remoteDispatchDomainBlockStatsFlags(virNetServerPtr server
> ATTRIBUTE_UNUSED,
>
> /* Serialize the block stats. */
> if (virTypedParamsSerialize(params, nparams,
> + REMOTE_DOMAIN_BLOCK_STATS_PARAMETERS
> _MAX,
> (virTypedParameterRemotePtr *) &ret-
> >params.params_val,
> &ret->params.params_len,
> args->flags) < 0)
> @@ -3292,6 +3297,7 @@
> remoteDispatchDomainGetMemoryParameters(virNetServerPtr server
> ATTRIBUTE_UNUSED,
> }
>
> if (virTypedParamsSerialize(params, nparams,
> + REMOTE_DOMAIN_MEMORY_PARAMETERS_MAX,
> (virTypedParameterRemotePtr *) &ret-
> >params.params_val,
> &ret->params.params_len,
> args->flags) < 0)
> @@ -3351,6 +3357,7 @@
> remoteDispatchDomainGetNumaParameters(virNetServerPtr server
> ATTRIBUTE_UNUSED,
> }
>
> if (virTypedParamsSerialize(params, nparams,
> + REMOTE_DOMAIN_NUMA_PARAMETERS_MAX,
> (virTypedParameterRemotePtr *) &ret-
> >params.params_val,
> &ret->params.params_len,
> flags) < 0)
> @@ -3410,6 +3417,7 @@
> remoteDispatchDomainGetBlkioParameters(virNetServerPtr server
> ATTRIBUTE_UNUSED,
> }
>
> if (virTypedParamsSerialize(params, nparams,
> + REMOTE_DOMAIN_BLKIO_PARAMETERS_MAX,
> (virTypedParameterRemotePtr *) &ret-
> >params.params_val,
> &ret->params.params_len,
> args->flags) < 0)
> @@ -3587,12 +3595,8 @@
> remoteDispatchDomainGetLaunchSecurityInfo(virNetServerPtr server
> ATTRIBUTE_UNUSE
> if (virDomainGetLaunchSecurityInfo(dom, ¶ms, &nparams, args-
> >flags) < 0)
> goto cleanup;
>
> - if (nparams > REMOTE_DOMAIN_LAUNCH_SECURITY_INFO_PARAMS_MAX) {
> - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too
> large"));
> - goto cleanup;
> - }
> -
> if (virTypedParamsSerialize(params, nparams,
> + REMOTE_DOMAIN_LAUNCH_SECURITY_INFO_P
> ARAMS_MAX,
> (virTypedParameterRemotePtr *) &ret-
> >params.params_val,
> &ret->params.params_len,
> args->flags) < 0)
> @@ -3631,12 +3635,8 @@
> remoteDispatchDomainGetPerfEvents(virNetServerPtr server
> ATTRIBUTE_UNUSED,
> if (virDomainGetPerfEvents(dom, ¶ms, &nparams, args->flags)
> < 0)
> goto cleanup;
>
> - if (nparams > REMOTE_DOMAIN_PERF_EVENTS_MAX) {
> - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too
> large"));
> - goto cleanup;
> - }
> -
> if (virTypedParamsSerialize(params, nparams,
> + REMOTE_DOMAIN_PERF_EVENTS_MAX,
> (virTypedParameterRemotePtr *) &ret-
> >params.params_val,
> &ret->params.params_len,
> 0) < 0)
> @@ -3732,6 +3732,7 @@
> remoteDispatchDomainGetBlockIoTune(virNetServerPtr server
> ATTRIBUTE_UNUSED,
>
> /* Serialize the block I/O tuning parameters. */
> if (virTypedParamsSerialize(params, nparams,
> + REMOTE_DOMAIN_BLOCK_IO_TUNE_PARAMETE
> RS_MAX,
> (virTypedParameterRemotePtr *) &ret-
> >params.params_val,
> &ret->params.params_len,
> args->flags) < 0)
> @@ -5289,6 +5290,7 @@
> remoteDispatchDomainGetInterfaceParameters(virNetServerPtr server
> ATTRIBUTE_UNUS
> }
>
> if (virTypedParamsSerialize(params, nparams,
> + REMOTE_DOMAIN_INTERFACE_PARAMETERS_M
> AX,
> (virTypedParameterRemotePtr *) &ret-
> >params.params_val,
> &ret->params.params_len,
> flags) < 0)
> @@ -5348,6 +5350,7 @@ remoteDispatchDomainGetCPUStats(virNetServerPtr
> server ATTRIBUTE_UNUSED,
> goto success;
>
> if (virTypedParamsSerialize(params, args->nparams * args->ncpus,
> + REMOTE_DOMAIN_GET_CPU_STATS_MAX,
> (virTypedParameterRemotePtr *) &ret-
> >params.params_val,
> &ret->params.params_len,
> args->flags) < 0)
> @@ -5450,13 +5453,8 @@ remoteDispatchNodeGetSevInfo(virNetServerPtr
> server ATTRIBUTE_UNUSED,
> if (virNodeGetSEVInfo(conn, ¶ms, &nparams, args->flags) < 0)
> goto cleanup;
>
> - if (nparams > REMOTE_NODE_SEV_INFO_MAX) {
> - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too
> large"));
> - goto cleanup;
> - }
> -
> -
> if (virTypedParamsSerialize(params, nparams,
> + REMOTE_NODE_SEV_INFO_MAX,
> (virTypedParameterRemotePtr *) &ret-
> >params.params_val,
> &ret->params.params_len,
> args->flags) < 0)
> @@ -5511,6 +5509,7 @@
> remoteDispatchNodeGetMemoryParameters(virNetServerPtr server
> ATTRIBUTE_UNUSED,
> }
>
> if (virTypedParamsSerialize(params, nparams,
> + REMOTE_NODE_MEMORY_PARAMETERS_MAX,
> (virTypedParameterRemotePtr *) &ret-
> >params.params_val,
> &ret->params.params_len,
> args->flags) < 0)
> @@ -5641,14 +5640,8 @@
> remoteDispatchDomainGetJobStats(virNetServerPtr server
> ATTRIBUTE_UNUSED,
> &nparams, args->flags) < 0)
> goto cleanup;
>
> - if (nparams > REMOTE_DOMAIN_JOB_STATS_MAX) {
> - virReportError(VIR_ERR_RPC,
> - _("Too many job stats '%d' for limit '%d'"),
> - nparams, REMOTE_DOMAIN_JOB_STATS_MAX);
> - goto cleanup;
> - }
> -
> if (virTypedParamsSerialize(params, nparams,
> + REMOTE_DOMAIN_JOB_STATS_MAX,
> (virTypedParameterRemotePtr *) &ret-
> >params.params_val,
> &ret->params.params_len,
> 0) < 0)
> @@ -7018,6 +7011,7 @@
> remoteDispatchConnectGetAllDomainStats(virNetServerPtr server
> ATTRIBUTE_UNUSED,
>
> if (virTypedParamsSerialize(retStats[i]->params,
> retStats[i]->nparams,
> + REMOTE_CONNECT_GET_ALL_DOMAI
> N_STATS_MAX,
> (virTypedParameterRemotePtr
> *) &dst->params.params_val,
> &dst->params.params_len,
> VIR_TYPED_PARAM_STRING_OKAY)
> < 0)
> @@ -7370,12 +7364,8 @@
> remoteDispatchNetworkPortGetParameters(virNetServerPtr server
> ATTRIBUTE_UNUSED,
> if (virNetworkPortGetParameters(port, ¶ms, &nparams, args-
> >flags) < 0)
> goto cleanup;
>
> - if (nparams > REMOTE_NETWORK_PORT_PARAMETERS_MAX) {
> - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too
> large"));
> - goto cleanup;
> - }
> -
> if (virTypedParamsSerialize(params, nparams,
> + REMOTE_NETWORK_PORT_PARAMETERS_MAX,
> (virTypedParameterRemotePtr *) &ret-
> >params.params_val,
> &ret->params.params_len,
> args->flags) < 0)
> @@ -7674,14 +7664,8 @@
> remoteDispatchDomainGetGuestInfo(virNetServerPtr server
> ATTRIBUTE_UNUSED,
> if (virDomainGetGuestInfo(dom, args->types, ¶ms, &nparams,
> args->flags) < 0)
> goto cleanup;
>
> - if (nparams > REMOTE_DOMAIN_GUEST_INFO_PARAMS_MAX) {
> - virReportError(VIR_ERR_RPC,
> - _("Too many params in guestinfo: %d for limit
> %d"),
> - nparams,
> REMOTE_DOMAIN_GUEST_INFO_PARAMS_MAX);
> - goto cleanup;
> - }
> -
> if (virTypedParamsSerialize(params, nparams,
> + REMOTE_DOMAIN_GUEST_INFO_PARAMS_MAX,
> (virTypedParameterRemotePtr *) &ret-
> >params.params_val,
> &ret->params.params_len,
> VIR_TYPED_PARAM_STRING_OKAY) < 0)
> diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
> index 8cc7ab3663..2b86f55035 100644
> --- a/src/remote/remote_driver.c
> +++ b/src/remote/remote_driver.c
> @@ -7109,14 +7109,8 @@ remoteDomainMigrateBegin3Params(virDomainPtr
> domain,
> make_nonnull_domain(&args.dom, domain);
> args.flags = flags;
>
> - if (nparams > REMOTE_DOMAIN_MIGRATE_PARAM_LIST_MAX) {
> - virReportError(VIR_ERR_RPC,
> - _("Too many migration parameters '%d' for
> limit '%d'"),
> - nparams,
> REMOTE_DOMAIN_MIGRATE_PARAM_LIST_MAX);
> - goto cleanup;
> - }
> -
> if (virTypedParamsSerialize(params, nparams,
> + REMOTE_DOMAIN_MIGRATE_PARAM_LIST_MAX
> ,
> (virTypedParameterRemotePtr *)
> &args.params.params_val,
> &args.params.params_len,
> VIR_TYPED_PARAM_STRING_OKAY) < 0) {
> @@ -7177,14 +7171,8 @@
> remoteDomainMigratePrepare3Params(virConnectPtr dconn,
> memset(&args, 0, sizeof(args));
> memset(&ret, 0, sizeof(ret));
>
> - if (nparams > REMOTE_DOMAIN_MIGRATE_PARAM_LIST_MAX) {
> - virReportError(VIR_ERR_RPC,
> - _("Too many migration parameters '%d' for
> limit '%d'"),
> - nparams,
> REMOTE_DOMAIN_MIGRATE_PARAM_LIST_MAX);
> - goto cleanup;
> - }
> -
> if (virTypedParamsSerialize(params, nparams,
> + REMOTE_DOMAIN_MIGRATE_PARAM_LIST_MAX
> ,
> (virTypedParameterRemotePtr *)
> &args.params.params_val,
> &args.params.params_len,
> VIR_TYPED_PARAM_STRING_OKAY) < 0) {
> @@ -7261,18 +7249,12 @@
> remoteDomainMigratePrepareTunnel3Params(virConnectPtr dconn,
> memset(&args, 0, sizeof(args));
> memset(&ret, 0, sizeof(ret));
>
> - if (nparams > REMOTE_DOMAIN_MIGRATE_PARAM_LIST_MAX) {
> - virReportError(VIR_ERR_RPC,
> - _("Too many migration parameters '%d' for
> limit '%d'"),
> - nparams,
> REMOTE_DOMAIN_MIGRATE_PARAM_LIST_MAX);
> - goto cleanup;
> - }
> -
> args.cookie_in.cookie_in_val = (char *)cookiein;
> args.cookie_in.cookie_in_len = cookieinlen;
> args.flags = flags;
>
> if (virTypedParamsSerialize(params, nparams,
> + REMOTE_DOMAIN_MIGRATE_PARAM_LIST_MAX
> ,
> (virTypedParameterRemotePtr *)
> &args.params.params_val,
> &args.params.params_len,
> VIR_TYPED_PARAM_STRING_OKAY) < 0) {
> @@ -7351,13 +7333,6 @@ remoteDomainMigratePerform3Params(virDomainPtr
> dom,
> memset(&args, 0, sizeof(args));
> memset(&ret, 0, sizeof(ret));
>
> - if (nparams > REMOTE_DOMAIN_MIGRATE_PARAM_LIST_MAX) {
> - virReportError(VIR_ERR_RPC,
> - _("Too many migration parameters '%d' for
> limit '%d'"),
> - nparams,
> REMOTE_DOMAIN_MIGRATE_PARAM_LIST_MAX);
> - goto cleanup;
> - }
> -
> make_nonnull_domain(&args.dom, dom);
> args.dconnuri = dconnuri == NULL ? NULL : (char **) &dconnuri;
> args.cookie_in.cookie_in_val = (char *)cookiein;
> @@ -7365,6 +7340,7 @@ remoteDomainMigratePerform3Params(virDomainPtr
> dom,
> args.flags = flags;
>
> if (virTypedParamsSerialize(params, nparams,
> + REMOTE_DOMAIN_MIGRATE_PARAM_LIST_MAX
> ,
> (virTypedParameterRemotePtr *)
> &args.params.params_val,
> &args.params.params_len,
> VIR_TYPED_PARAM_STRING_OKAY) < 0) {
> @@ -7425,19 +7401,13 @@
> remoteDomainMigrateFinish3Params(virConnectPtr dconn,
> memset(&args, 0, sizeof(args));
> memset(&ret, 0, sizeof(ret));
>
> - if (nparams > REMOTE_DOMAIN_MIGRATE_PARAM_LIST_MAX) {
> - virReportError(VIR_ERR_RPC,
> - _("Too many migration parameters '%d' for
> limit '%d'"),
> - nparams,
> REMOTE_DOMAIN_MIGRATE_PARAM_LIST_MAX);
> - goto cleanup;
> - }
> -
> args.cookie_in.cookie_in_val = (char *)cookiein;
> args.cookie_in.cookie_in_len = cookieinlen;
> args.flags = flags;
> args.cancelled = cancelled;
>
> if (virTypedParamsSerialize(params, nparams,
> + REMOTE_DOMAIN_MIGRATE_PARAM_LIST_MAX
> ,
> (virTypedParameterRemotePtr *)
> &args.params.params_val,
> &args.params.params_len,
> VIR_TYPED_PARAM_STRING_OKAY) < 0) {
> @@ -7499,13 +7469,6 @@ remoteDomainMigrateConfirm3Params(virDomainPtr
> domain,
>
> memset(&args, 0, sizeof(args));
>
> - if (nparams > REMOTE_DOMAIN_MIGRATE_PARAM_LIST_MAX) {
> - virReportError(VIR_ERR_RPC,
> - _("Too many migration parameters '%d' for
> limit '%d'"),
> - nparams,
> REMOTE_DOMAIN_MIGRATE_PARAM_LIST_MAX);
> - goto cleanup;
> - }
> -
> make_nonnull_domain(&args.dom, domain);
> args.cookie_in.cookie_in_len = cookieinlen;
> args.cookie_in.cookie_in_val = (char *) cookiein;
> @@ -7513,6 +7476,7 @@ remoteDomainMigrateConfirm3Params(virDomainPtr
> domain,
> args.cancelled = cancelled;
>
> if (virTypedParamsSerialize(params, nparams,
> + REMOTE_DOMAIN_MIGRATE_PARAM_LIST_MAX
> ,
> (virTypedParameterRemotePtr *)
> &args.params.params_val,
> &args.params.params_len,
> VIR_TYPED_PARAM_STRING_OKAY) < 0) {
> diff --git a/src/rpc/gendispatch.pl b/src/rpc/gendispatch.pl
> index ff21834091..9d3cc5b145 100755
> --- a/src/rpc/gendispatch.pl
> +++ b/src/rpc/gendispatch.pl
> @@ -951,6 +951,7 @@ elsif ($mode eq "server") {
> splice(@args_list, int($5), 0, "&$1_len");
>
> push(@ret_list, "if (virTypedParamsSerialize($1,
> $1_len,\n" .
> + "
> $2,\n" .
> "
> (virTypedParameterRemotePtr *) &ret->$1.$1_val,\n" .
> "
> &ret->$1.$1_len,\n" .
> "
> VIR_TYPED_PARAM_STRING_OKAY) < 0)\n" .
> @@ -1436,6 +1437,7 @@ elsif ($mode eq "client") {
> push(@args_list, "virTypedParameterPtr $1");
> push(@args_list, "int n$1");
> push(@setters_list2, "if
> (virTypedParamsSerialize($1, n$1,\n" .
> + "
> $2,\n" .
> "
> (virTypedParameterRemotePtr *) &args.$1.$1_val,\n" .
> "
> &args.$1.$1_len,\n" .
> "
> VIR_TYPED_PARAM_STRING_OKAY) < 0) {\n" .
> diff --git a/src/util/virtypedparam.c b/src/util/virtypedparam.c
> index 8f23348d97..779714d146 100644
> --- a/src/util/virtypedparam.c
> +++ b/src/util/virtypedparam.c
> @@ -1480,12 +1480,15 @@
> virTypedParamsDeserialize(virTypedParameterRemotePtr remote_params,
> * virTypedParamsSerialize:
> * @params: array of parameters to be serialized and later sent to
> remote side
> * @nparams: number of elements in @params
> + * @limit: user specified maximum limit to @remote_params_len
> * @remote_params_val: protocol independent remote representation of
> @params
> * @remote_params_len: the final number of elements in
> @remote_params_val
> * @flags: bitwise-OR of virTypedParameterFlags
> *
> * This method serializes typed parameters provided by @params into
> * @remote_params_val which is the representation actually being
> sent.
> + * It also checks, if the @limit imposed by RPC on the maximum
> number of
> + * parameters is not exceeded.
> *
> * Server side using this method also filters out any string
> parameters that
> * must not be returned to older clients and handles possibly sparse
> arrays
> @@ -1496,6 +1499,7 @@
> virTypedParamsDeserialize(virTypedParameterRemotePtr remote_params,
> int
> virTypedParamsSerialize(virTypedParameterPtr params,
> int nparams,
> + int limit,
> virTypedParameterRemotePtr
> *remote_params_val,
> unsigned int *remote_params_len,
> unsigned int flags)
> @@ -1503,9 +1507,16 @@ virTypedParamsSerialize(virTypedParameterPtr
> params,
> size_t i;
> size_t j;
> int rv = -1;
> - virTypedParameterRemotePtr params_val;
> + virTypedParameterRemotePtr params_val = NULL;
> int params_len = nparams;
>
> + if (nparams > limit) {
> + virReportError(VIR_ERR_RPC,
> + _("too many parameters '%d' for limit '%d'"),
> + nparams, limit);
> + goto cleanup;
> + }
> +
> if (VIR_ALLOC_N(params_val, nparams) < 0)
> goto cleanup;
>
> diff --git a/src/util/virtypedparam.h b/src/util/virtypedparam.h
> index ce4e75b389..f9d22b24fb 100644
> --- a/src/util/virtypedparam.h
> +++ b/src/util/virtypedparam.h
> @@ -113,6 +113,7 @@ int
> virTypedParamsDeserialize(virTypedParameterRemotePtr remote_params,
>
> int virTypedParamsSerialize(virTypedParameterPtr params,
> int nparams,
> + int limit,
> virTypedParameterRemotePtr
> *remote_params_val,
> unsigned int *remote_params_len,
> unsigned int flags);
More information about the libvir-list
mailing list