diff options
author | Vishal Chillara Srinivas <vishal.chillarasrinivas@philips.com> | 2022-03-17 11:49:00 +0530 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2022-03-17 20:12:26 +0900 |
commit | e8aba093b405bb53cd26d82d26436aa4836b2e83 (patch) | |
tree | 0b19bafcfd632cdfbb21339864a0713d70c13af7 /src/shared/varlink.c | |
parent | ac33e147546464ae3ccaa378beda389507984285 (diff) | |
download | systemd-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.c | 31 |
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(¶meters_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(¶meters_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; } |