aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/xen-netback
diff options
context:
space:
mode:
authorDavid Vrabel <david.vrabel@citrix.com>2016-01-15 09:55:36 -0500
committerDavid S. Miller <davem@davemloft.net>2016-01-15 15:13:19 -0500
commit9c6f3ffe8200327d1cf2aad2ff2b414adaacbe96 (patch)
tree8240a079a4eb513a9d71565a3051526d71329dda /drivers/net/xen-netback
parent4a658527271bce43afb1cf4feec89afe6716ca59 (diff)
xen-netback: free queues after freeing the net device
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>
Diffstat (limited to 'drivers/net/xen-netback')
-rw-r--r--drivers/net/xen-netback/interface.c16
1 files changed, 5 insertions, 11 deletions
diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c
index 3bba6ceee132..f5231a2dd2ac 100644
--- a/drivers/net/xen-netback/interface.c
+++ b/drivers/net/xen-netback/interface.c
@@ -685,22 +685,16 @@ void xenvif_deinit_queue(struct xenvif_queue *queue)
685 685
686void xenvif_free(struct xenvif *vif) 686void xenvif_free(struct xenvif *vif)
687{ 687{
688 struct xenvif_queue *queue = NULL; 688 struct xenvif_queue *queues = vif->queues;
689 unsigned int num_queues = vif->num_queues; 689 unsigned int num_queues = vif->num_queues;
690 unsigned int queue_index; 690 unsigned int queue_index;
691 691
692 unregister_netdev(vif->dev); 692 unregister_netdev(vif->dev);
693
694 for (queue_index = 0; queue_index < num_queues; ++queue_index) {
695 queue = &vif->queues[queue_index];
696 xenvif_deinit_queue(queue);
697 }
698
699 vfree(vif->queues);
700 vif->queues = NULL;
701 vif->num_queues = 0;
702
703 free_netdev(vif->dev); 693 free_netdev(vif->dev);
704 694
695 for (queue_index = 0; queue_index < num_queues; ++queue_index)
696 xenvif_deinit_queue(&queues[queue_index]);
697 vfree(queues);
698
705 module_put(THIS_MODULE); 699 module_put(THIS_MODULE);
706} 700}