summaryrefslogtreecommitdiff
path: root/src/shared/varlink.c
diff options
context:
space:
mode:
authorVishal Chillara Srinivas <vishal.chillarasrinivas@philips.com>2022-03-17 11:49:00 +0530
committerYu Watanabe <watanabe.yu+github@gmail.com>2022-03-17 20:12:26 +0900
commite8aba093b405bb53cd26d82d26436aa4836b2e83 (patch)
tree0b19bafcfd632cdfbb21339864a0713d70c13af7 /src/shared/varlink.c
parentac33e147546464ae3ccaa378beda389507984285 (diff)
downloadsystemd-e8aba093b405bb53cd26d82d26436aa4836b2e83.tar.gz
varlink_error_invalid_parameter(...) always returns EINVAL
varlink_error(...) expects a json object as the third parameter. Passing a string variant causes parameter sanitization to fail, and it returns -EINVAL. Pass object variant instead.
Diffstat (limited to 'src/shared/varlink.c')
-rw-r--r--src/shared/varlink.c31
1 files changed, 26 insertions, 5 deletions
diff --git a/src/shared/varlink.c b/src/shared/varlink.c
index e0038dfd28..04e69a601e 100644
--- a/src/shared/varlink.c
+++ b/src/shared/varlink.c
@@ -1660,6 +1660,7 @@ int varlink_errorb(Varlink *v, const char *error_id, ...) {
}
int varlink_error_invalid_parameter(Varlink *v, JsonVariant *parameters) {
+ int r;
assert_return(v, -EINVAL);
assert_return(parameters, -EINVAL);
@@ -1669,13 +1670,33 @@ int varlink_error_invalid_parameter(Varlink *v, JsonVariant *parameters) {
* variant in which case we'll pull out the first key. The latter mode is useful in functions that
* don't expect any arguments. */
- if (json_variant_is_string(parameters))
- return varlink_error(v, VARLINK_ERROR_INVALID_PARAMETER, parameters);
+ /* varlink_error(...) expects a json object as the third parameter. Passing a string variant causes
+ * parameter sanitization to fail, and it returns -EINVAL. */
+
+ if (json_variant_is_string(parameters)) {
+ _cleanup_(json_variant_unrefp) JsonVariant *parameters_obj = NULL;
+
+ r = json_build(&parameters_obj,
+ JSON_BUILD_OBJECT(
+ JSON_BUILD_PAIR("parameter", JSON_BUILD_VARIANT(parameters))));
+ if (r < 0)
+ return r;
+
+ return varlink_error(v, VARLINK_ERROR_INVALID_PARAMETER, parameters_obj);
+ }
if (json_variant_is_object(parameters) &&
- json_variant_elements(parameters) > 0)
- return varlink_error(v, VARLINK_ERROR_INVALID_PARAMETER,
- json_variant_by_index(parameters, 0));
+ json_variant_elements(parameters) > 0) {
+ _cleanup_(json_variant_unrefp) JsonVariant *parameters_obj = NULL;
+
+ r = json_build(&parameters_obj,
+ JSON_BUILD_OBJECT(
+ JSON_BUILD_PAIR("parameter", JSON_BUILD_VARIANT(json_variant_by_index(parameters, 0)))));
+ if (r < 0)
+ return r;
+
+ return varlink_error(v, VARLINK_ERROR_INVALID_PARAMETER, parameters_obj);
+ }
return -EINVAL;
}