mirror of
https://gitee.com/bianbu-linux/linux-6.6
synced 2025-04-26 14:17:26 -04:00
devlink: Validate port function request
In order to avoid partial request processing, validate the request before processing it. Signed-off-by: Shay Drory <shayd@nvidia.com> Reviewed-by: Jiri Pirko <jiri@nvidia.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
df268f6ca7
commit
c0bea69d1c
1 changed files with 23 additions and 9 deletions
|
@ -1632,11 +1632,6 @@ static int devlink_port_function_hw_addr_set(struct devlink_port *port,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ops->port_function_hw_addr_set) {
|
|
||||||
NL_SET_ERR_MSG_MOD(extack, "Port doesn't support function attributes");
|
|
||||||
return -EOPNOTSUPP;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ops->port_function_hw_addr_set(port, hw_addr, hw_addr_len,
|
return ops->port_function_hw_addr_set(port, hw_addr, hw_addr_len,
|
||||||
extack);
|
extack);
|
||||||
}
|
}
|
||||||
|
@ -1650,12 +1645,27 @@ static int devlink_port_fn_state_set(struct devlink_port *port,
|
||||||
|
|
||||||
state = nla_get_u8(attr);
|
state = nla_get_u8(attr);
|
||||||
ops = port->devlink->ops;
|
ops = port->devlink->ops;
|
||||||
if (!ops->port_fn_state_set) {
|
return ops->port_fn_state_set(port, state, extack);
|
||||||
NL_SET_ERR_MSG_MOD(extack,
|
}
|
||||||
|
|
||||||
|
static int devlink_port_function_validate(struct devlink_port *devlink_port,
|
||||||
|
struct nlattr **tb,
|
||||||
|
struct netlink_ext_ack *extack)
|
||||||
|
{
|
||||||
|
const struct devlink_ops *ops = devlink_port->devlink->ops;
|
||||||
|
|
||||||
|
if (tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR] &&
|
||||||
|
!ops->port_function_hw_addr_set) {
|
||||||
|
NL_SET_ERR_MSG_ATTR(extack, tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR],
|
||||||
|
"Port doesn't support function attributes");
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
if (tb[DEVLINK_PORT_FN_ATTR_STATE] && !ops->port_fn_state_set) {
|
||||||
|
NL_SET_ERR_MSG_ATTR(extack, tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR],
|
||||||
"Function does not support state setting");
|
"Function does not support state setting");
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
return ops->port_fn_state_set(port, state, extack);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int devlink_port_function_set(struct devlink_port *port,
|
static int devlink_port_function_set(struct devlink_port *port,
|
||||||
|
@ -1672,6 +1682,10 @@ static int devlink_port_function_set(struct devlink_port *port,
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = devlink_port_function_validate(port, tb, extack);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
attr = tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR];
|
attr = tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR];
|
||||||
if (attr) {
|
if (attr) {
|
||||||
err = devlink_port_function_hw_addr_set(port, attr, extack);
|
err = devlink_port_function_hw_addr_set(port, attr, extack);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue