xen-netback: free queues after freeing the net device
authorDavid Vrabel <david.vrabel@citrix.com>
Fri, 15 Jan 2016 14:55:36 +0000 (14:55 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 15 Jan 2016 20:13:19 +0000 (15:13 -0500)
If a queue still has a NAPI instance added to the net device, freeing
the queues early results in a use-after-free.

The shouldn't ever happen because we disconnect and tear down all queues
before freeing the net device, but doing this makes it obviously safe.

Signed-off-by: David Vrabel <david.vrabel@citrix.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/xen-netback/interface.c

index 3bba6ceee1328913299f9514ad2efe3f95dd57fa..f5231a2dd2ac961089029c8acd40f97c3cb7991b 100644 (file)
@@ -685,22 +685,16 @@ void xenvif_deinit_queue(struct xenvif_queue *queue)
 
 void xenvif_free(struct xenvif *vif)
 {
-       struct xenvif_queue *queue = NULL;
+       struct xenvif_queue *queues = vif->queues;
        unsigned int num_queues = vif->num_queues;
        unsigned int queue_index;
 
        unregister_netdev(vif->dev);
-
-       for (queue_index = 0; queue_index < num_queues; ++queue_index) {
-               queue = &vif->queues[queue_index];
-               xenvif_deinit_queue(queue);
-       }
-
-       vfree(vif->queues);
-       vif->queues = NULL;
-       vif->num_queues = 0;
-
        free_netdev(vif->dev);
 
+       for (queue_index = 0; queue_index < num_queues; ++queue_index)
+               xenvif_deinit_queue(&queues[queue_index]);
+       vfree(queues);
+
        module_put(THIS_MODULE);
 }