From 81474dfb23bae6bdf6a559951150766472c14d92 Mon Sep 17 00:00:00 2001
From: Aaron An <anjb@ti-net.com.cn>
Date: Mon, 18 Dec 2017 20:14:11 +0800
Subject: [PATCH] res_rtp_asterisk:  Avoid close the rtp/rtcp fd twice.

When RTCP-MUX enabled. rtp->s is the same as rtcp->s, check this before
close the file descriptor. Close the FD twice will hangs the asterisk
under heavy load.

ASTERISK-27299 #close
Reported-by: Aaron An
Tested-by: AaronAn

Change-Id: I870a072d73fd207463ac116ef97100addbc0820a
---
 res/res_rtp_asterisk.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/res/res_rtp_asterisk.c b/res/res_rtp_asterisk.c
index 51e509c777..913fbad1c0 100644
--- a/res/res_rtp_asterisk.c
+++ b/res/res_rtp_asterisk.c
@@ -3481,6 +3481,7 @@ static int rtp_allocate_transport(struct ast_rtp_instance *instance, struct ast_
 
 static void rtp_deallocate_transport(struct ast_rtp_instance *instance, struct ast_rtp *rtp)
 {
+	int saved_rtp_s = rtp->s;
 #ifdef HAVE_PJPROJECT
 	struct timeval wait = ast_tvadd(ast_tvnow(), ast_samp2tv(TURN_STATE_WAIT_TIME, 1000));
 	struct timespec ts = { .tv_sec = wait.tv_sec, .tv_nsec = wait.tv_usec * 1000, };
@@ -3498,7 +3499,9 @@ static void rtp_deallocate_transport(struct ast_rtp_instance *instance, struct a
 
 	/* Destroy RTCP if it was being used */
 	if (rtp->rtcp && rtp->rtcp->s > -1) {
-		close(rtp->rtcp->s);
+		if (saved_rtp_s != rtp->rtcp->s) {
+			close(rtp->rtcp->s);
+		}
 		rtp->rtcp->s = -1;
 	}
 
-- 
GitLab