static void make_nonnull_nwfilter(remote_nonnull_nwfilter *net_dst, virNWFilterPtr nwfilter_src);
static void make_nonnull_domain_snapshot(remote_nonnull_domain_snapshot *snapshot_dst, virDomainSnapshotPtr snapshot_src);
-static int
-remoteSerializeTypedParameters(virTypedParameterPtr params,
- int nparams,
- remote_typed_param **ret_params_val,
- u_int *ret_params_len);
static virTypedParameterPtr
remoteDeserializeTypedParameters(remote_typed_param *args_params_val,
u_int args_params_len,
return rv;
}
-/* Helper to serialize typed parameters. */
+/* Helper to serialize typed parameters. This also filters out any string
+ * parameters that must not be returned to older clients. */
static int
remoteSerializeTypedParameters(virTypedParameterPtr params,
int nparams,
remote_typed_param **ret_params_val,
- u_int *ret_params_len)
+ u_int *ret_params_len,
+ unsigned int flags)
{
int i;
+ int j;
int rv = -1;
remote_typed_param *val;
goto cleanup;
}
- for (i = 0; i < nparams; ++i) {
+ for (i = 0, j = 0; i < nparams; ++i) {
+ if (!(flags & VIR_TYPED_PARAM_STRING_OKAY) &&
+ params[i].type == VIR_TYPED_PARAM_STRING) {
+ --*ret_params_len;
+ continue;
+ }
+
/* remoteDispatchClientRequest will free this: */
- val[i].field = strdup (params[i].field);
- if (val[i].field == NULL) {
+ val[j].field = strdup(params[i].field);
+ if (val[j].field == NULL) {
virReportOOMError();
goto cleanup;
}
- val[i].value.type = params[i].type;
- switch (params[i].type) {
+ val[j].value.type = params[i].type;
+ switch (params[j].type) {
case VIR_TYPED_PARAM_INT:
- val[i].value.remote_typed_param_value_u.i = params[i].value.i;
+ val[j].value.remote_typed_param_value_u.i = params[i].value.i;
break;
case VIR_TYPED_PARAM_UINT:
- val[i].value.remote_typed_param_value_u.ui = params[i].value.ui;
+ val[j].value.remote_typed_param_value_u.ui = params[i].value.ui;
break;
case VIR_TYPED_PARAM_LLONG:
- val[i].value.remote_typed_param_value_u.l = params[i].value.l;
+ val[j].value.remote_typed_param_value_u.l = params[i].value.l;
break;
case VIR_TYPED_PARAM_ULLONG:
- val[i].value.remote_typed_param_value_u.ul = params[i].value.ul;
+ val[j].value.remote_typed_param_value_u.ul = params[i].value.ul;
break;
case VIR_TYPED_PARAM_DOUBLE:
- val[i].value.remote_typed_param_value_u.d = params[i].value.d;
+ val[j].value.remote_typed_param_value_u.d = params[i].value.d;
break;
case VIR_TYPED_PARAM_BOOLEAN:
- val[i].value.remote_typed_param_value_u.b = params[i].value.b;
+ val[j].value.remote_typed_param_value_u.b = params[i].value.b;
+ break;
+ case VIR_TYPED_PARAM_STRING:
+ val[j].value.remote_typed_param_value_u.s =
+ strdup(params[i].value.s);
+ if (val[j].value.remote_typed_param_value_u.s == NULL) {
+ virReportOOMError();
+ goto cleanup;
+ }
break;
default:
virNetError(VIR_ERR_RPC, _("unknown parameter type: %d"),
params[i].type);
goto cleanup;
}
+ j++;
}
*ret_params_val = val;
cleanup:
if (val) {
- for (i = 0; i < nparams; i++)
+ for (i = 0; i < nparams; i++) {
VIR_FREE(val[i].field);
+ if (params[i].type == VIR_TYPED_PARAM_STRING)
+ VIR_FREE(val[i].value.remote_typed_param_value_u.s);
+ }
VIR_FREE(val);
}
return rv;
int limit,
int *nparams)
{
- int i;
+ int i = 0;
int rv = -1;
virTypedParameterPtr params = NULL;
params[i].value.b =
args_params_val[i].value.remote_typed_param_value_u.b;
break;
+ case VIR_TYPED_PARAM_STRING:
+ params[i].value.s =
+ strdup(args_params_val[i].value.remote_typed_param_value_u.s);
+ if (params[i].value.s == NULL) {
+ virReportOOMError();
+ goto cleanup;
+ }
+ break;
default:
virNetError(VIR_ERR_INTERNAL_ERROR, _("unknown parameter type: %d"),
params[i].type);
rv = 0;
cleanup:
- if (rv < 0)
+ if (rv < 0) {
+ int j;
+ for (j = 0; j < i; ++j) {
+ if (params[j].type == VIR_TYPED_PARAM_STRING)
+ VIR_FREE(params[j].value.s);
+ }
VIR_FREE(params);
+ }
return params;
}
if (remoteSerializeTypedParameters(params, nparams,
&ret->params.params_val,
- &ret->params.params_len) < 0)
+ &ret->params.params_len,
+ 0) < 0)
goto cleanup;
rv = 0;
if (remoteSerializeTypedParameters(params, nparams,
&ret->params.params_val,
- &ret->params.params_len) < 0)
+ &ret->params.params_len,
+ args->flags) < 0)
goto cleanup;
rv = 0;
/* Serialise the block stats. */
if (remoteSerializeTypedParameters(params, nparams,
&ret->params.params_val,
- &ret->params.params_len) < 0)
+ &ret->params.params_len,
+ args->flags) < 0)
goto cleanup;
success:
if (remoteSerializeTypedParameters(params, nparams,
&ret->params.params_val,
- &ret->params.params_len) < 0)
+ &ret->params.params_len,
+ args->flags) < 0)
goto cleanup;
success:
if (remoteSerializeTypedParameters(params, nparams,
&ret->params.params_val,
- &ret->params.params_len) < 0)
+ &ret->params.params_len,
+ args->flags) < 0)
goto cleanup;
success:
cleanup:
if (rv < 0)
virNetMessageSaveError(rerr);
+ virTypedParameterArrayClear(params, nparams);
VIR_FREE(params);
if (dom)
virDomainFree(dom);
if (args_params_val == NULL)
return;
- for (i = 0; i < args_params_len; i++)
+ for (i = 0; i < args_params_len; i++) {
VIR_FREE(args_params_val[i].field);
+ if (args_params_val[i].value.type == VIR_TYPED_PARAM_STRING)
+ VIR_FREE(args_params_val[i].value.remote_typed_param_value_u.s);
+ }
VIR_FREE(args_params_val);
}
case VIR_TYPED_PARAM_BOOLEAN:
val[i].value.remote_typed_param_value_u.b = params[i].value.b;
break;
+ case VIR_TYPED_PARAM_STRING:
+ val[i].value.remote_typed_param_value_u.s = strdup(params[i].value.s);
+ if (val[i].value.remote_typed_param_value_u.s == NULL) {
+ virReportOOMError();
+ goto cleanup;
+ }
+ break;
default:
remoteError(VIR_ERR_RPC, _("unknown parameter type: %d"),
params[i].type);
virTypedParameterPtr params,
int *nparams)
{
- int i;
+ int i = 0;
int rv = -1;
/* Check the length of the returned list carefully. */
params[i].value.b =
ret_params_val[i].value.remote_typed_param_value_u.b;
break;
+ case VIR_TYPED_PARAM_STRING:
+ params[i].value.s =
+ strdup(ret_params_val[i].value.remote_typed_param_value_u.s);
+ if (params[i].value.s == NULL) {
+ virReportOOMError();
+ goto cleanup;
+ }
+ break;
default:
remoteError(VIR_ERR_RPC, _("unknown parameter type: %d"),
params[i].type);
rv = 0;
cleanup:
+ if (rv < 0) {
+ int j;
+ for (j = 0; j < i; j++)
+ if (params[j].type == VIR_TYPED_PARAM_STRING)
+ VIR_FREE(params[j].value.s);
+ }
return rv;
}