mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02: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,
 | 
			
		||||
					      extack);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1650,12 +1645,27 @@ static int devlink_port_fn_state_set(struct devlink_port *port,
 | 
			
		|||
 | 
			
		||||
	state = nla_get_u8(attr);
 | 
			
		||||
	ops = port->devlink->ops;
 | 
			
		||||
	if (!ops->port_fn_state_set) {
 | 
			
		||||
		NL_SET_ERR_MSG_MOD(extack,
 | 
			
		||||
				   "Function does not support state setting");
 | 
			
		||||
	return ops->port_fn_state_set(port, state, 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;
 | 
			
		||||
	}
 | 
			
		||||
	return ops->port_fn_state_set(port, state, extack);
 | 
			
		||||
	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");
 | 
			
		||||
		return -EOPNOTSUPP;
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = devlink_port_function_validate(port, tb, extack);
 | 
			
		||||
	if (err)
 | 
			
		||||
		return err;
 | 
			
		||||
 | 
			
		||||
	attr = tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR];
 | 
			
		||||
	if (attr) {
 | 
			
		||||
		err = devlink_port_function_hw_addr_set(port, attr, extack);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue