net: ice: Fix potential NULL pointer dereference in ice_bridge_setlink()

Message ID 20240228155448.121603-1-rand.sec96@gmail.com
State New
Headers
Series net: ice: Fix potential NULL pointer dereference in ice_bridge_setlink() |

Commit Message

Rand Deeb Feb. 28, 2024, 3:54 p.m. UTC
  The function ice_bridge_setlink() may encounter a NULL pointer dereference
if nlmsg_find_attr() returns NULL and br_spec is dereferenced subsequently
in nla_for_each_nested(). To address this issue, add a check to ensure that
br_spec is not NULL before proceeding with the nested attribute iteration.

Signed-off-by: Rand Deeb <rand.sec96@gmail.com>
---
 drivers/net/ethernet/intel/ice/ice_main.c | 2 ++
 1 file changed, 2 insertions(+)
  

Comments

Simon Horman March 1, 2024, 3:26 p.m. UTC | #1
On Wed, Feb 28, 2024 at 06:54:48PM +0300, Rand Deeb wrote:
> The function ice_bridge_setlink() may encounter a NULL pointer dereference
> if nlmsg_find_attr() returns NULL and br_spec is dereferenced subsequently
> in nla_for_each_nested(). To address this issue, add a check to ensure that
> br_spec is not NULL before proceeding with the nested attribute iteration.
> 
> Signed-off-by: Rand Deeb <rand.sec96@gmail.com>

Thanks Rand,

I do wonder if for some reason this cannot ever occur.
But assuming it can then I agree with the fix.

Reviewed-by: Simon Horman <horms@kernel.org>

As a fix I think it probably warrants a fixes tag and
being applied to net. As such, the following seems appropriate.

Fixes: b1edc14a3fbf ("ice: Implement ice_bridge_getlink and ice_bridge_setlink")

..
  

Patch

diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
index 4f0d63fa5709..ba2bbd53d543 100644
--- a/drivers/net/ethernet/intel/ice/ice_main.c
+++ b/drivers/net/ethernet/intel/ice/ice_main.c
@@ -6530,6 +6530,8 @@  ice_bridge_setlink(struct net_device *dev, struct nlmsghdr *nlh,
 	pf_sw = pf->first_sw;
 	/* find the attribute in the netlink message */
 	br_spec = nlmsg_find_attr(nlh, sizeof(struct ifinfomsg), IFLA_AF_SPEC);
+	if (!br_spec)
+		return -EINVAL;
 
 	nla_for_each_nested(attr, br_spec, rem) {
 		__u16 mode;