net: qualcomm: rmnet: Fix potential UAF when unregistering
authorSean Tranchetti <stranche@codeaurora.org>
Tue, 5 Nov 2019 00:54:22 +0000 (17:54 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 6 Nov 2019 02:18:03 +0000 (18:18 -0800)
During the exit/unregistration process of the RmNet driver, the function
rmnet_unregister_real_device() is called to handle freeing the driver's
internal state and removing the RX handler on the underlying physical
device. However, the order of operations this function performs is wrong
and can lead to a use after free of the rmnet_port structure.

Before calling netdev_rx_handler_unregister(), this port structure is
freed with kfree(). If packets are received on any RmNet devices before
synchronize_net() completes, they will attempt to use this already-freed
port structure when processing the packet. As such, before cleaning up any
other internal state, the RX handler must be unregistered in order to
guarantee that no further packets will arrive on the device.

Fixes: ceed73a2cf4a ("drivers: net: ethernet: qualcomm: rmnet: Initial implementation")
Signed-off-by: Sean Tranchetti <stranche@codeaurora.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c

index 9c54b715228e020bac2ab04906e7e914ba56d821..06de59521fc4a5e0d8861672525ab39406f98f18 100644 (file)
@@ -57,10 +57,10 @@ static int rmnet_unregister_real_device(struct net_device *real_dev,
        if (port->nr_rmnet_devs)
                return -EINVAL;
 
-       kfree(port);
-
        netdev_rx_handler_unregister(real_dev);
 
+       kfree(port);
+
        /* release reference on real_dev */
        dev_put(real_dev);