[asterisk-commits] jrose: branch 1.8 r366791 - /branches/1.8/channels/chan_sip.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Thu May 17 09:40:13 CDT 2012
Author: jrose
Date: Thu May 17 09:40:07 2012
New Revision: 366791
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=366791
Log:
chan_sip: Fix missed locking of opposing pvt for directmedia acl from r366547
It also required deadlock avoidance since two sip_pvts structs needed to be
locked simultaneously. Trunk handles it differently, so this is a 1.8 and 10
patch only.
Modified:
branches/1.8/channels/chan_sip.c
Modified: branches/1.8/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/chan_sip.c?view=diff&rev=366791&r1=366790&r2=366791
==============================================================================
--- branches/1.8/channels/chan_sip.c (original)
+++ branches/1.8/channels/chan_sip.c Thu May 17 09:40:07 2012
@@ -29083,11 +29083,19 @@
}
sip_pvt_lock(p);
+ while (sip_pvt_trylock(opp)) {
+ sip_pvt_unlock(p);
+ usleep(1);
+ sip_pvt_lock(p);
+ }
+
if (p->udptl && ast_test_flag(&p->flags[0], SIP_DIRECT_MEDIA)) {
if (apply_directmedia_ha(p, opp, "UDPTL T.38 data")) {
udptl = p->udptl;
}
}
+
+ sip_pvt_unlock(opp);
sip_pvt_unlock(p);
return udptl;
}
@@ -29153,7 +29161,14 @@
}
sip_pvt_lock(p);
+ while (sip_pvt_trylock(opp)) {
+ sip_pvt_unlock(p);
+ usleep(1);
+ sip_pvt_lock(p);
+ }
+
if (!(p->rtp)) {
+ sip_pvt_unlock(opp);
sip_pvt_unlock(p);
return AST_RTP_GLUE_RESULT_FORBID;
}
@@ -29172,6 +29187,8 @@
res = AST_RTP_GLUE_RESULT_FORBID;
}
+ sip_pvt_unlock(opp);
+
if (p->srtp) {
res = AST_RTP_GLUE_RESULT_FORBID;
}
@@ -29199,7 +29216,14 @@
}
sip_pvt_lock(p);
+ while (sip_pvt_trylock(opp)) {
+ sip_pvt_unlock(p);
+ usleep(1);
+ sip_pvt_lock(p);
+ }
+
if (!(p->vrtp)) {
+ sip_pvt_unlock(opp);
sip_pvt_unlock(p);
return AST_RTP_GLUE_RESULT_FORBID;
}
@@ -29214,6 +29238,7 @@
}
}
+ sip_pvt_unlock(opp);
sip_pvt_unlock(p);
return res;
@@ -29237,7 +29262,14 @@
}
sip_pvt_lock(p);
+ while (sip_pvt_trylock(opp)) {
+ sip_pvt_unlock(p);
+ usleep(1);
+ sip_pvt_lock(p);
+ }
+
if (!(p->trtp)) {
+ sip_pvt_unlock(opp);
sip_pvt_unlock(p);
return AST_RTP_GLUE_RESULT_FORBID;
}
@@ -29252,6 +29284,7 @@
}
}
+ sip_pvt_unlock(opp);
sip_pvt_unlock(p);
return res;
More information about the asterisk-commits
mailing list