History

devlink: Validate port function request

In order to avoid partial request processing, validate the request before processing it.

Shay Drory committed 3 years ago

Commit c0bea691 parent df268f61 file · +23 −9Browse files

Unified · Split

net/core/devlink.c+23−9
@@ -1632,11 +1632,6 @@ static int devlink_port_function_hw_addr_set(struct devlink_port *port, · 1631 unmodified lines
1632 }1632 }
1633 }1633 }
1634 1634
1635 if (!ops->port_function_hw_addr_set) {
1636 NL_SET_ERR_MSG_MOD(extack, "Port doesn't support function attributes");
1637 return -EOPNOTSUPP;
1638 }
1639
1640 return ops->port_function_hw_addr_set(port, hw_addr, hw_addr_len,1635 return ops->port_function_hw_addr_set(port, hw_addr, hw_addr_len,
1641 extack);1636 extack);
1642}1637}
@@ -1650,12 +1645,27 @@ static int devlink_port_fn_state_set(struct devlink_port *port, · 7 unmodified lines
1650 1645
1651 state = nla_get_u8(attr);1646 state = nla_get_u8(attr);
1652 ops = port->devlink->ops;1647 ops = port->devlink->ops;
1653 if (!ops->port_fn_state_set) {1648 return ops->port_fn_state_set(port, state, extack);
1654 NL_SET_ERR_MSG_MOD(extack,1649}
1655 "Function does not support state setting");1650
1651static int devlink_port_function_validate(struct devlink_port *devlink_port,
1652 struct nlattr **tb,
1653 struct netlink_ext_ack *extack)
1654{
1655 const struct devlink_ops *ops = devlink_port->devlink->ops;
1656
1657 if (tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR] &&
1658 !ops->port_function_hw_addr_set) {
1659 NL_SET_ERR_MSG_ATTR(extack, tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR],
1660 "Port doesn't support function attributes");
1656 return -EOPNOTSUPP;1661 return -EOPNOTSUPP;
1657 }1662 }
1658 return ops->port_fn_state_set(port, state, extack);1663 if (tb[DEVLINK_PORT_FN_ATTR_STATE] && !ops->port_fn_state_set) {
1664 NL_SET_ERR_MSG_ATTR(extack, tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR],
1665 "Function does not support state setting");
1666 return -EOPNOTSUPP;
1667 }
1668 return 0;
1659}1669}
1660 1670
1661static int devlink_port_function_set(struct devlink_port *port,1671static int devlink_port_function_set(struct devlink_port *port,
@@ -1672,6 +1682,10 @@ static int devlink_port_function_set(struct devlink_port *port, · 10 unmodified lines
1672 return err;1682 return err;
1673 }1683 }
1674 1684
1685 err = devlink_port_function_validate(port, tb, extack);
1686 if (err)
1687 return err;
1688
1675 attr = tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR];1689 attr = tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR];
1676 if (attr) {1690 if (attr) {
1677 err = devlink_port_function_hw_addr_set(port, attr, extack);1691 err = devlink_port_function_hw_addr_set(port, attr, extack);

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t