Merged revisions 256225 via svnmerge from
authorRichard Mudgett <rmudgett@digium.com>
Tue, 6 Apr 2010 00:39:44 +0000 (00:39 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Tue, 6 Apr 2010 00:39:44 +0000 (00:39 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
  r256225 | rmudgett | 2010-04-05 19:10:16 -0500 (Mon, 05 Apr 2010) | 5 lines

  DAHDI/PRI call to pri_channel_bridge() not protected by PRI lock.

  SWP-1231
  ABE-2163
........

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@256265 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_dahdi.c

index 72e341e..356106e 100644 (file)
@@ -6666,25 +6666,31 @@ static enum ast_bridge_result dahdi_bridge(struct ast_channel *c0, struct ast_ch
                }
 
 #ifdef PRI_2BCT
-               switch (p0->sig) {
-               case SIG_PRI_LIB_HANDLE_CASES:
-                       q931c0 = ((struct sig_pri_chan *) (p0->sig_pvt))->call;
-                       break;
-               default:
-                       q931c0 = NULL;
-                       break;
-               }
-               switch (p1->sig) {
-               case SIG_PRI_LIB_HANDLE_CASES:
-                       q931c1 = ((struct sig_pri_chan *) (p1->sig_pvt))->call;
-                       break;
-               default:
-                       q931c1 = NULL;
-                       break;
-               }
-               if (q931c0 && q931c1 && p0->transfer && p1->transfer && !triedtopribridge) {
+               if (!triedtopribridge) {
                        triedtopribridge = 1;
-                       pri_channel_bridge(q931c0, q931c1);
+                       if (p0->pri && p0->pri == p1->pri && p0->transfer && p1->transfer) {
+                               ast_mutex_lock(&p0->pri->lock);
+                               switch (p0->sig) {
+                               case SIG_PRI_LIB_HANDLE_CASES:
+                                       q931c0 = ((struct sig_pri_chan *) (p0->sig_pvt))->call;
+                                       break;
+                               default:
+                                       q931c0 = NULL;
+                                       break;
+                               }
+                               switch (p1->sig) {
+                               case SIG_PRI_LIB_HANDLE_CASES:
+                                       q931c1 = ((struct sig_pri_chan *) (p1->sig_pvt))->call;
+                                       break;
+                               default:
+                                       q931c1 = NULL;
+                                       break;
+                               }
+                               if (q931c0 && q931c1) {
+                                       pri_channel_bridge(q931c0, q931c1);
+                               }
+                               ast_mutex_unlock(&p0->pri->lock);
+                       }
                }
 #endif