[PATCH] net: core: Fix possible null-pointer dereference in failover_slave_register()

Subsystems: failover module, networking [general], the rest

STALE1847d

2 messages, 2 authors, 2021-08-10 · open the first message on its own page

[PATCH] net: core: Fix possible null-pointer dereference in failover_slave_register()

From: Tuo Li <hidden>
Date: 2021-08-10 09:18:31

The variable fops is checked in:
  if (fops && fops->slave_pre_register &&
    fops->slave_pre_register(slave_dev, failover_dev))

This indicates that it can be NULL.
However, it is dereferenced when calling netdev_rx_handler_register():
  err = netdev_rx_handler_register(slave_dev, fops->slave_handle_frame,
                    failover_dev);

To fix this possible null-pointer dereference, check fops first, and if 
it is NULL, assign -EINVAL to err.

Reported-by: TOTE Robot <redacted>
Signed-off-by: Tuo Li <redacted>
---
 net/core/failover.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/net/core/failover.c b/net/core/failover.c
index b5cd3c727285..113a4dacdf48 100644
--- a/net/core/failover.c
+++ b/net/core/failover.c
@@ -63,8 +63,11 @@ static int failover_slave_register(struct net_device *slave_dev)
 	    fops->slave_pre_register(slave_dev, failover_dev))
 		goto done;
 
-	err = netdev_rx_handler_register(slave_dev, fops->slave_handle_frame,
+	if (fops)
+		err = netdev_rx_handler_register(slave_dev, fops->slave_handle_frame,
 					 failover_dev);
+	else
+		err = -EINVAL;
 	if (err) {
 		netdev_err(slave_dev, "can not register failover rx handler (err = %d)\n",
 			   err);
-- 
2.25.1

Re: [PATCH] net: core: Fix possible null-pointer dereference in failover_slave_register()

From: Jakub Kicinski <kuba@kernel.org>
Date: 2021-08-10 15:04:09

On Tue, 10 Aug 2021 02:18:00 -0700 Tuo Li wrote:
The variable fops is checked in:
  if (fops && fops->slave_pre_register &&
    fops->slave_pre_register(slave_dev, failover_dev))

This indicates that it can be NULL.
However, it is dereferenced when calling netdev_rx_handler_register():
  err = netdev_rx_handler_register(slave_dev, fops->slave_handle_frame,
                    failover_dev);

To fix this possible null-pointer dereference, check fops first, and if 
it is NULL, assign -EINVAL to err.
The other fops checks look like defensive programming. I don't see
anywhere where fops would be cleared, and all callers pass it to
register().
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help