]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
devlink: Fix cmd_dev_param_set() to check configuration mode
authorMoshe Shemesh <moshe@nvidia.com>
Sun, 31 Oct 2021 06:48:47 +0000 (08:48 +0200)
committerStephen Hemminger <stephen@networkplumber.org>
Tue, 2 Nov 2021 15:34:33 +0000 (08:34 -0700)
This patch is fixing a bug, when param set user command includes
configuration mode which is not supported, the tool may not respond
with error if the requested value is 0. In such case
cmd_dev_param_set_cb() won't find the requested configuration mode and
returns ctx->value as initialized (equal 0). Then cmd_dev_param_set()
may find that requested value equals current value and returns success.

Fixing the bug by adding a flag cmode_found which is set only if
cmd_dev_param_set_cb() finds the requested configuration mode.

Fixes: 13925ae9eb38 ("devlink: Add param command support")
Signed-off-by: Moshe Shemesh <moshe@nvidia.com>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
devlink/devlink.c

index 2f2142ed385666cde1d280fd0c792a35917853a1..14fbc856ab63f4f11b23451f53e3fea00466cb1c 100644 (file)
@@ -3036,6 +3036,7 @@ static int cmd_dev_param_show_cb(const struct nlmsghdr *nlh, void *data)
 struct param_ctx {
        struct dl *dl;
        int nla_type;
+       bool cmode_found;
        union {
                uint8_t vu8;
                uint16_t vu16;
@@ -3088,6 +3089,7 @@ static int cmd_dev_param_set_cb(const struct nlmsghdr *nlh, void *data)
 
                cmode = mnl_attr_get_u8(nla_value[DEVLINK_ATTR_PARAM_VALUE_CMODE]);
                if (cmode == dl->opts.cmode) {
+                       ctx->cmode_found = true;
                        val_attr = nla_value[DEVLINK_ATTR_PARAM_VALUE_DATA];
                        switch (nla_type) {
                        case MNL_TYPE_U8:
@@ -3140,6 +3142,10 @@ static int cmd_dev_param_set(struct dl *dl)
        err = mnlu_gen_socket_sndrcv(&dl->nlg, nlh, cmd_dev_param_set_cb, &ctx);
        if (err)
                return err;
+       if (!ctx.cmode_found) {
+               pr_err("Configuration mode not supported\n");
+               return -ENOTSUP;
+       }
 
        nlh = mnlu_gen_socket_cmd_prepare(&dl->nlg, DEVLINK_CMD_PARAM_SET,
                               NLM_F_REQUEST | NLM_F_ACK);