From: Moshe Shemesh Date: Sun, 31 Oct 2021 06:48:47 +0000 (+0200) Subject: devlink: Fix cmd_dev_param_set() to check configuration mode X-Git-Tag: v5.16.0~16^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=047e9ae516b5427158c0653f15c9c20d3965e4e5;p=thirdparty%2Fiproute2.git devlink: Fix cmd_dev_param_set() to check configuration mode 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 Signed-off-by: Stephen Hemminger --- diff --git a/devlink/devlink.c b/devlink/devlink.c index 2f2142ed3..14fbc856a 100644 --- a/devlink/devlink.c +++ b/devlink/devlink.c @@ -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);