ubus: use BLOBMSG_TYPE_UNSPEC for "params" JSON attribute
authorRafał Miłecki <rafal@milecki.pl>
Sat, 25 Jul 2020 08:18:50 +0000 (10:18 +0200)
committerRafał Miłecki <rafal@milecki.pl>
Wed, 5 Aug 2020 06:22:57 +0000 (08:22 +0200)
According to the JSON-RPC 2.0 specification "params" value can be either
an Array or Object. This change makes parse_json_rpc() accept both.

Type validation should be handled by a function that actually reads
"params" depending on expected format. This doesn't change existing
behaviour but allows adding more methods (that expect Object) in the
future.

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
ubus.c

diff --git a/ubus.c b/ubus.c
index 51c58b5498e120fed8f49f15ff0eb04419e1e82b..ddc2f05d7d244eae01ccc56ca22bffc8eae623a5 100644 (file)
--- a/ubus.c
+++ b/ubus.c
@@ -48,7 +48,7 @@ enum {
 static const struct blobmsg_policy rpc_policy[__RPC_MAX] = {
        [RPC_JSONRPC] = { .name = "jsonrpc", .type = BLOBMSG_TYPE_STRING },
        [RPC_METHOD] = { .name = "method", .type = BLOBMSG_TYPE_STRING },
-       [RPC_PARAMS] = { .name = "params", .type = BLOBMSG_TYPE_ARRAY },
+       [RPC_PARAMS] = { .name = "params", .type = BLOBMSG_TYPE_UNSPEC },
        [RPC_ID] = { .name = "id", .type = BLOBMSG_TYPE_UNSPEC },
 };
 
@@ -446,6 +446,9 @@ static void parse_call_params(struct rpc_data *d)
        };
        struct blob_attr *tb[4];
 
+       if (!d->params || blobmsg_type(d->params) != BLOBMSG_TYPE_ARRAY)
+               return;
+
        blobmsg_parse_array(data_policy, ARRAY_SIZE(data_policy), tb,
                            blobmsg_data(d->params), blobmsg_data_len(d->params));