aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/hostap/hostap_pci.c
diff options
context:
space:
mode:
authorJouni Malinen <jkmaline@cc.hut.fi>2005-10-02 20:19:00 -0400
committerJeff Garzik <jgarzik@pobox.com>2005-10-03 22:00:08 -0400
commitc355184cd3cd58c9ffc78f2a17e0ac3563312ea7 (patch)
treef6de150b08f98540bf660cedffd77785ce75b479 /drivers/net/wireless/hostap/hostap_pci.c
parentf7a74447553d698795ba74b7e17e916000b0cb08 (diff)
[PATCH] hostap: Do not free local->hw_priv before unregistering netdev
local->hw_priv was being freed and set to NULL just before calling prism2_free_local_data(). However, this may expose a race condition in which something ends up trying to use hw_priv during shutdown. I haven't noticed this happening, but better be safe than sorry, so let's postpone hw_priv freeing to happen only after prism2_free_local_data() has returned. Signed-off-by: Jouni Malinen <jkmaline@cc.hut.fi> Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
Diffstat (limited to 'drivers/net/wireless/hostap/hostap_pci.c')
-rw-r--r--drivers/net/wireless/hostap/hostap_pci.c9
1 files changed, 2 insertions, 7 deletions
diff --git a/drivers/net/wireless/hostap/hostap_pci.c b/drivers/net/wireless/hostap/hostap_pci.c
index 0d7305dfa69..da0c80fb941 100644
--- a/drivers/net/wireless/hostap/hostap_pci.c
+++ b/drivers/net/wireless/hostap/hostap_pci.c
@@ -358,8 +358,6 @@ static int prism2_pci_probe(struct pci_dev *pdev,
358 return hostap_hw_ready(dev); 358 return hostap_hw_ready(dev);
359 359
360 fail: 360 fail:
361 kfree(hw_priv);
362
363 if (irq_registered && dev) 361 if (irq_registered && dev)
364 free_irq(dev->irq, dev); 362 free_irq(dev->irq, dev);
365 363
@@ -370,10 +368,8 @@ static int prism2_pci_probe(struct pci_dev *pdev,
370 368
371 err_out_disable: 369 err_out_disable:
372 pci_disable_device(pdev); 370 pci_disable_device(pdev);
373 kfree(hw_priv);
374 if (local)
375 local->hw_priv = NULL;
376 prism2_free_local_data(dev); 371 prism2_free_local_data(dev);
372 kfree(hw_priv);
377 373
378 return -ENODEV; 374 return -ENODEV;
379} 375}
@@ -398,9 +394,8 @@ static void prism2_pci_remove(struct pci_dev *pdev)
398 free_irq(dev->irq, dev); 394 free_irq(dev->irq, dev);
399 395
400 mem_start = hw_priv->mem_start; 396 mem_start = hw_priv->mem_start;
401 kfree(hw_priv);
402 iface->local->hw_priv = NULL;
403 prism2_free_local_data(dev); 397 prism2_free_local_data(dev);
398 kfree(hw_priv);
404 399
405 iounmap(mem_start); 400 iounmap(mem_start);
406 401