diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 93b191dfc7..7b89edb61b 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -29083,11 +29083,19 @@ static struct ast_udptl *sip_get_udptl_peer(struct ast_channel *chan) } 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 @@ static enum ast_rtp_glue_result sip_get_rtp_peer(struct ast_channel *chan, struc } 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 @@ static enum ast_rtp_glue_result sip_get_rtp_peer(struct ast_channel *chan, struc res = AST_RTP_GLUE_RESULT_FORBID; } + sip_pvt_unlock(opp); + if (p->srtp) { res = AST_RTP_GLUE_RESULT_FORBID; } @@ -29199,7 +29216,14 @@ static enum ast_rtp_glue_result sip_get_vrtp_peer(struct ast_channel *chan, stru } 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 @@ static enum ast_rtp_glue_result sip_get_vrtp_peer(struct ast_channel *chan, stru } } + sip_pvt_unlock(opp); sip_pvt_unlock(p); return res; @@ -29237,7 +29262,14 @@ static enum ast_rtp_glue_result sip_get_trtp_peer(struct ast_channel *chan, stru } 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 @@ static enum ast_rtp_glue_result sip_get_trtp_peer(struct ast_channel *chan, stru } } + sip_pvt_unlock(opp); sip_pvt_unlock(p); return res;