[svn-commits] sruffell: branch 1.4 r3586 - in /branches: 1.2/wctdm24xxp/ 1.2/wcte12xp/ 1.4/...
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Wed Jan 2 09:20:56 CST 2008
Author: sruffell
Date: Wed Jan 2 09:20:56 2008
New Revision: 3586
URL: http://svn.digium.com/view/zaptel?view=rev&rev=3586
Log:
Move the release of VPMADT032 resources to after the interrupt handler has been freed. Closes a
small window of opportunity for NULL pointer access at driver unload time.
Modified:
branches/1.2/wctdm24xxp/base.c
branches/1.2/wcte12xp/base.c
branches/1.4/wctdm24xxp/base.c
branches/1.4/wcte12xp/base.c
Modified: branches/1.2/wctdm24xxp/base.c
URL: http://svn.digium.com/view/zaptel/branches/1.2/wctdm24xxp/base.c?view=diff&rev=3586&r1=3585&r2=3586
==============================================================================
--- branches/1.2/wctdm24xxp/base.c (original)
+++ branches/1.2/wctdm24xxp/base.c Wed Jan 2 09:20:56 2008
@@ -3595,7 +3595,21 @@
clear_bit(VPM150M_ACTIVE, &vpm150m->control);
flush_workqueue(vpm150m->wq);
destroy_workqueue(vpm150m->wq);
-
+ }
+#endif
+
+ /* Stop any DMA */
+ wctdm_stop_dma(wc);
+
+ /* In case hardware is still there */
+ wctdm_disable_interrupts(wc);
+
+ /* Immediately free resources */
+ free_irq(pdev->irq, wc);
+ pci_free_consistent(pdev, PCI_WINDOW_SIZE, (void *)wc->writechunk, wc->writedma);
+
+#ifdef VPM150M_SUPPORT
+ if (vpm150m) {
spin_lock_irqsave(&wc->reglock, flags);
wc->vpm150m = NULL;
vpm150m->wc = NULL;
@@ -3604,16 +3618,6 @@
kfree(wc->vpm150m);
}
#endif
- /* Stop any DMA */
- wctdm_stop_dma(wc);
-
- /* In case hardware is still there */
- wctdm_disable_interrupts(wc);
-
- /* Immediately free resources */
- pci_free_consistent(pdev, PCI_WINDOW_SIZE, (void *)wc->writechunk, wc->writedma);
- free_irq(pdev->irq, wc);
-
/* Release span, possibly delayed */
if (!wc->usecount)
wctdm_release(wc);
Modified: branches/1.2/wcte12xp/base.c
URL: http://svn.digium.com/view/zaptel/branches/1.2/wcte12xp/base.c?view=diff&rev=3586&r1=3585&r2=3586
==============================================================================
--- branches/1.2/wcte12xp/base.c (original)
+++ branches/1.2/wcte12xp/base.c Wed Jan 2 09:20:56 2008
@@ -1979,28 +1979,30 @@
clear_bit(VPM150M_ACTIVE, &vpm150m->control);
flush_workqueue(vpm150m->wq);
destroy_workqueue(vpm150m->wq);
-
- kfree(wc->vpm150m);
-
+ }
+#endif
+ /* Stop any DMA */
+ t1_stop_dma(wc);
+
+ /* In case hardware is still there */
+ t1_disable_interrupts(wc);
+
+ if (debug && wc->isrreaderrors)
+ debug_printk(1, "isrreaderrors=%d\n", wc->isrreaderrors);
+
+ /* Immediately free resources */
+ free_irq(pdev->irq, wc);
+ pci_free_consistent(pdev, PCI_WINDOW_SIZE, (void *)wc->writechunk, wc->writedma);
+
+#ifdef VPM_SUPPORT
+ if(vpm150m) {
spin_lock_irqsave(&wc->reglock, flags);
wc->vpm150m = NULL;
vpm150m->wc = NULL;
spin_unlock_irqrestore(&wc->reglock, flags);
+ kfree(wc->vpm150m);
}
#endif
-
- /* Stop any DMA */
- t1_stop_dma(wc);
-
- /* In case hardware is still there */
- t1_disable_interrupts(wc);
-
- if (debug && wc->isrreaderrors)
- debug_printk(1, "isrreaderrors=%d\n", wc->isrreaderrors);
-
- /* Immediately free resources */
- pci_free_consistent(pdev, PCI_WINDOW_SIZE, (void *)wc->writechunk, wc->writedma);
- free_irq(pdev->irq, wc);
/* Release span, possibly delayed */
if (!wc->usecount)
Modified: branches/1.4/wctdm24xxp/base.c
URL: http://svn.digium.com/view/zaptel/branches/1.4/wctdm24xxp/base.c?view=diff&rev=3586&r1=3585&r2=3586
==============================================================================
--- branches/1.4/wctdm24xxp/base.c (original)
+++ branches/1.4/wctdm24xxp/base.c Wed Jan 2 09:20:56 2008
@@ -4238,31 +4238,35 @@
#endif
if (wc) {
+
#ifdef VPM150M_SUPPORT
if (vpm150m) {
clear_bit(VPM150M_DTMFDETECT, &vpm150m->control);
clear_bit(VPM150M_ACTIVE, &vpm150m->control);
flush_workqueue(vpm150m->wq);
destroy_workqueue(vpm150m->wq);
-
+ }
+#endif
+
+ /* Stop any DMA */
+ wctdm_stop_dma(wc);
+
+ /* In case hardware is still there */
+ wctdm_disable_interrupts(wc);
+
+ /* Immediately free resources */
+ free_irq(pdev->irq, wc);
+ pci_free_consistent(pdev, PCI_WINDOW_SIZE, (void *)wc->writechunk, wc->writedma);
+
+#ifdef VPM150M_SUPPORT
+ if (vpm150m) {
spin_lock_irqsave(&wc->reglock, flags);
wc->vpm150m = NULL;
vpm150m->wc = NULL;
spin_unlock_irqrestore(&wc->reglock, flags);
-
kfree(wc->vpm150m);
}
#endif
- /* Stop any DMA */
- wctdm_stop_dma(wc);
-
- /* In case hardware is still there */
- wctdm_disable_interrupts(wc);
-
- /* Immediately free resources */
- pci_free_consistent(pdev, PCI_WINDOW_SIZE, (void *)wc->writechunk, wc->writedma);
- free_irq(pdev->irq, wc);
-
/* Release span, possibly delayed */
if (!wc->usecount)
wctdm_release(wc);
Modified: branches/1.4/wcte12xp/base.c
URL: http://svn.digium.com/view/zaptel/branches/1.4/wcte12xp/base.c?view=diff&rev=3586&r1=3585&r2=3586
==============================================================================
--- branches/1.4/wcte12xp/base.c (original)
+++ branches/1.4/wcte12xp/base.c Wed Jan 2 09:20:56 2008
@@ -1973,7 +1973,6 @@
#ifdef VPM_SUPPORT
struct vpm150m *vpm150m = wc->vpm150m;
#endif
-
if (!wc)
return;
@@ -1983,29 +1982,30 @@
clear_bit(VPM150M_ACTIVE, &vpm150m->control);
flush_workqueue(vpm150m->wq);
destroy_workqueue(vpm150m->wq);
-
- kfree(wc->vpm150m);
-
+ }
+#endif
+ /* Stop any DMA */
+ t1_stop_dma(wc);
+
+ /* In case hardware is still there */
+ t1_disable_interrupts(wc);
+
+ if (debug && wc->isrreaderrors)
+ debug_printk(1, "isrreaderrors=%d\n", wc->isrreaderrors);
+
+ /* Immediately free resources */
+ free_irq(pdev->irq, wc);
+ pci_free_consistent(pdev, PCI_WINDOW_SIZE, (void *)wc->writechunk, wc->writedma);
+
+#ifdef VPM_SUPPORT
+ if(vpm150m) {
spin_lock_irqsave(&wc->reglock, flags);
wc->vpm150m = NULL;
vpm150m->wc = NULL;
spin_unlock_irqrestore(&wc->reglock, flags);
+ kfree(wc->vpm150m);
}
#endif
-
- /* Stop any DMA */
- t1_stop_dma(wc);
-
- /* In case hardware is still there */
- t1_disable_interrupts(wc);
-
- if (debug && wc->isrreaderrors)
- debug_printk(1, "isrreaderrors=%d\n", wc->isrreaderrors);
-
- /* Immediately free resources */
- pci_free_consistent(pdev, PCI_WINDOW_SIZE, (void *)wc->writechunk, wc->writedma);
- free_irq(pdev->irq, wc);
-
/* Release span, possibly delayed */
if (!wc->usecount)
t1_release(wc);
More information about the svn-commits
mailing list