diff options
author | David Vrabel <david.vrabel@citrix.com> | 2016-01-15 09:55:36 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-01-15 15:13:19 -0500 |
commit | 9c6f3ffe8200327d1cf2aad2ff2b414adaacbe96 (patch) | |
tree | 8240a079a4eb513a9d71565a3051526d71329dda /drivers/net/xen-netback | |
parent | 4a658527271bce43afb1cf4feec89afe6716ca59 (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.c | 16 |
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 | ||
686 | void xenvif_free(struct xenvif *vif) | 686 | void 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 | } |