From f4fb2716018b644c2e310d8226200599ed8473f6 Mon Sep 17 00:00:00 2001
From: Damien Wedhorn <voip@facts.com.au>
Date: Fri, 2 Nov 2012 20:56:43 +0000
Subject: [PATCH] Fix for chan_skinny leaving RTP ports open

Skinny wasn't closing RTP sockets. This patch includes ast_rtp_instance_stop before
ast_rtp_instance_destroy which fixes the problem. Also add destroy for VRTP (which
I believe is unused, but exists).

Review: https://reviewboard.asterisk.org/r/2176/


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@375660 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 channels/chan_skinny.c | 39 +++++++++++++++++++++++----------------
 1 file changed, 23 insertions(+), 16 deletions(-)

diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c
index c30338ae9e..2997ac834e 100644
--- a/channels/chan_skinny.c
+++ b/channels/chan_skinny.c
@@ -4234,6 +4234,22 @@ static void start_rtp(struct skinny_subchannel *sub)
 	ast_mutex_unlock(&sub->lock);
 }
 
+static void destroy_rtp(struct skinny_subchannel *sub)
+{
+	if (sub->rtp) {
+		SKINNY_DEBUG(DEBUG_AUDIO, 3, "Sub %d - Destroying RTP\n", sub->callid);
+		ast_rtp_instance_stop(sub->rtp);
+		ast_rtp_instance_destroy(sub->rtp);
+		sub->rtp = NULL;
+	}
+	if (sub->vrtp) {
+		SKINNY_DEBUG(DEBUG_AUDIO, 3, "Sub %d - Destroying VRTP\n", sub->callid);
+		ast_rtp_instance_stop(sub->vrtp);
+		ast_rtp_instance_destroy(sub->vrtp);
+		sub->vrtp = NULL;
+	}
+}
+
 static void *skinny_newcall(void *data)
 {
 	struct ast_channel *c = data;
@@ -4467,10 +4483,7 @@ static int skinny_hangup(struct ast_channel *ast)
 	ast_mutex_lock(&sub->lock);
 	sub->owner = NULL;
 	ast_channel_tech_pvt_set(ast, NULL);
-	if (sub->rtp) {
-		ast_rtp_instance_destroy(sub->rtp);
-		sub->rtp = NULL;
-	}
+	destroy_rtp(sub);
 	ast_mutex_unlock(&sub->lock);
 	ast_free(sub);
 	ast_module_unref(ast_module_info->self);
@@ -5082,20 +5095,17 @@ static void setsubstate(struct skinny_subchannel *sub, int state)
 				transmit_closereceivechannel(d, sub);
 				transmit_stopmediatransmission(d, sub);
 			}
-			
+
 			if (subline->callid) {
 				transmit_stop_tone(d, l->instance, sub->callid);
 				transmit_callstate(d, l->instance, subline->callid, SKINNY_CALLREMOTEMULTILINE);
 				transmit_selectsoftkeys(d, l->instance, subline->callid, KEYDEF_SLACONNECTEDNOTACTIVE);
 				transmit_displaypromptstatus(d, "In Use", 0, l->instance, subline->callid);
 			}
-			
-			sub->cxmode = SKINNY_CX_RECVONLY;	
+
+			sub->cxmode = SKINNY_CX_RECVONLY;
 			sub->substate = SUBSTATE_ONHOOK;
-			if (sub->rtp) {
-				ast_rtp_instance_destroy(sub->rtp);
-				sub->rtp = NULL;
-			}
+			destroy_rtp(sub);
 			sub->substate = SUBSTATE_ONHOOK;
 			if (sub->owner) {
 				ast_queue_hangup(sub->owner);
@@ -5203,12 +5213,9 @@ static void setsubstate(struct skinny_subchannel *sub, int state)
 			transmit_clearpromptmessage(d, l->instance, sub->callid);
 		}
 
-		sub->cxmode = SKINNY_CX_RECVONLY;	
+		sub->cxmode = SKINNY_CX_RECVONLY;
 		sub->substate = SUBSTATE_ONHOOK;
-		if (sub->rtp) {
-			ast_rtp_instance_destroy(sub->rtp);
-			sub->rtp = NULL;
-		}
+		destroy_rtp(sub);
 		if (sub->owner) {
 			ast_queue_hangup(sub->owner);
 		}
-- 
GitLab