summaryrefslogtreecommitdiff
path: root/channels
diff options
context:
space:
mode:
authorzuul <zuul@gerrit.asterisk.org>2016-06-09 13:54:01 -0500
committerGerrit Code Review <gerrit2@gerrit.digium.api>2016-06-09 13:54:01 -0500
commit8438315428ce44b956c4f38e84ff982d04951cfe (patch)
tree43e25f4a594b7f8bb33bb5480b5f3be0cce6bc6b /channels
parenta99ddc6a0d2b9075c2cc436a6770c8ac889f5286 (diff)
parent715ef071a1d27d550ddc3f83d9ff569381b8fddc (diff)
Merge "chan_pjsip: Lock channel when checking for RTP changes." into 13
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_pjsip.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c
index f081bd899..970fef496 100644
--- a/channels/chan_pjsip.c
+++ b/channels/chan_pjsip.c
@@ -269,6 +269,9 @@ static int direct_media_mitigate_glare(struct ast_sip_session *session)
return 0;
}
+/*!
+ * \pre chan is locked
+ */
static int check_for_rtp_changes(struct ast_channel *chan, struct ast_rtp_instance *rtp,
struct ast_sip_session_media *media, int rtcp_fd)
{
@@ -338,6 +341,11 @@ static int send_direct_media_request(void *data)
int changed = 0;
int res = 0;
+ /* The channel needs to be locked when checking for RTP changes.
+ * Otherwise, we could end up destroying an underlying RTCP structure
+ * at the same time that the channel thread is attempting to read RTCP
+ */
+ ast_channel_lock(cdata->chan);
if (pvt->media[SIP_MEDIA_AUDIO]) {
changed |= check_for_rtp_changes(
cdata->chan, cdata->rtp, pvt->media[SIP_MEDIA_AUDIO], 1);
@@ -346,6 +354,7 @@ static int send_direct_media_request(void *data)
changed |= check_for_rtp_changes(
cdata->chan, cdata->vrtp, pvt->media[SIP_MEDIA_VIDEO], 3);
}
+ ast_channel_unlock(cdata->chan);
if (direct_media_mitigate_glare(cdata->session)) {
ast_debug(4, "Disregarding setting RTP on %s: mitigating re-INVITE glare\n", ast_channel_name(cdata->chan));