diff options
author | Jouni Malinen <jkmaline@cc.hut.fi> | 2005-10-02 20:19:00 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-10-03 22:00:08 -0400 |
commit | c355184cd3cd58c9ffc78f2a17e0ac3563312ea7 (patch) | |
tree | f6de150b08f98540bf660cedffd77785ce75b479 /drivers/net/wireless/hostap/hostap_pci.c | |
parent | f7a74447553d698795ba74b7e17e916000b0cb08 (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.c | 9 |
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 | ||