From 6bd501ac9d9ce133c720255f5a539d48a170e9a5 Mon Sep 17 00:00:00 2001
From: mom040267 <mom040267@users.noreply.github.com>
Date: Sun, 30 Nov 2014 03:29:18 +0000
Subject: [PATCH] peer_input_handler fixes

---
 ChangeLog                   |  4 ++++
 rpm/build.settings.sh       |  2 +-
 rpm/turnserver.spec         |  4 +++-
 src/apps/relay/mainrelay.c  | 32 ++++++++++++++++++++------------
 src/ns_turn_defs.h          |  2 +-
 src/server/ns_turn_server.c | 25 ++++++++++++++-----------
 6 files changed, 43 insertions(+), 26 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 67b75fee..50ecdf5c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+11/29/2014 Oleg Moskalenko <mom040267@gmail.com>
+Version 4.3.1.3 'Tolomei':
+	- Reliability fixes (Issue 141 from rfc5766-turn-server).
+	
 11/23/2014 Oleg Moskalenko <mom040267@gmail.com>
 Version 4.3.1.2 'Tolomei':
 	- Debian package fixes.
diff --git a/rpm/build.settings.sh b/rpm/build.settings.sh
index ffc7e827..e4c19573 100755
--- a/rpm/build.settings.sh
+++ b/rpm/build.settings.sh
@@ -2,7 +2,7 @@
 
 # Common settings script.
 
-TURNVERSION=4.3.1.2
+TURNVERSION=4.3.1.3
 BUILDDIR=~/rpmbuild
 ARCH=`uname -p`
 TURNSERVER_SVN_URL=http://coturn.googlecode.com/svn
diff --git a/rpm/turnserver.spec b/rpm/turnserver.spec
index 0a05c68c..6b76d9e6 100644
--- a/rpm/turnserver.spec
+++ b/rpm/turnserver.spec
@@ -1,5 +1,5 @@
 Name:		turnserver
-Version:	4.3.1.2
+Version:	4.3.1.3
 Release:	0%{dist}
 Summary:	Coturn TURN Server
 
@@ -294,6 +294,8 @@ fi
 %{_includedir}/turn/client/TurnMsgLib.h
 
 %changelog
+* Sat Nov 29 2014 Oleg Moskalenko <mom040267@gmail.com>
+  - Sync to 4.3.1.3
 * Mon Nov 23 2014 Oleg Moskalenko <mom040267@gmail.com>
   - Sync to 4.3.1.2
 * Mon Nov 22 2014 Oleg Moskalenko <mom040267@gmail.com>
diff --git a/src/apps/relay/mainrelay.c b/src/apps/relay/mainrelay.c
index 129cc389..9327da13 100644
--- a/src/apps/relay/mainrelay.c
+++ b/src/apps/relay/mainrelay.c
@@ -2063,15 +2063,17 @@ int main(int argc, char **argv)
 
 #if defined(OPENSSL_THREADS)
 
-static pthread_mutex_t* mutex_buf = NULL;
+static pthread_mutex_t** mutex_buf = NULL;
 
 static void locking_function(int mode, int n, const char *file, int line) {
   UNUSED_ARG(file);
   UNUSED_ARG(line);
-  if (mode & CRYPTO_LOCK)
-    pthread_mutex_lock(&mutex_buf[n]);
-  else
-    pthread_mutex_unlock(&mutex_buf[n]);
+  if(mutex_buf && (n < CRYPTO_num_locks()) && mutex_buf[n]) {
+	  if (mode & CRYPTO_LOCK)
+		  pthread_mutex_lock(mutex_buf[n]);
+	  else
+		  pthread_mutex_unlock(mutex_buf[n]);
+  }
 }
 
 #if OPENSSL_VERSION_NUMBER >= 0x10000000L
@@ -2094,12 +2096,13 @@ static int THREAD_setup(void) {
 
 	int i;
 
-	mutex_buf = (pthread_mutex_t*) turn_malloc(CRYPTO_num_locks()
-			* sizeof(pthread_mutex_t));
+	mutex_buf = (pthread_mutex_t**) turn_malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t*));
 	if (!mutex_buf)
 		return 0;
-	for (i = 0; i < CRYPTO_num_locks(); i++)
-		pthread_mutex_init(&mutex_buf[i], NULL);
+	for (i = 0; i < CRYPTO_num_locks(); i++) {
+		mutex_buf[i] = (pthread_mutex_t*) turn_malloc(sizeof(pthread_mutex_t));
+		pthread_mutex_init(mutex_buf[i], NULL);
+	}
 
 #if OPENSSL_VERSION_NUMBER >= 0x10000000L
 	CRYPTO_THREADID_set_callback(id_function);
@@ -2130,9 +2133,14 @@ int THREAD_cleanup(void) {
 #endif
 
   CRYPTO_set_locking_callback(NULL);
-  for (i = 0; i < CRYPTO_num_locks(); i++)
-    pthread_mutex_destroy(&mutex_buf[i]);
-  turn_free(mutex_buf,sizeof(pthread_mutex_t));
+  for (i = 0; i < CRYPTO_num_locks(); i++) {
+	  if(mutex_buf[i]) {
+		  pthread_mutex_destroy(mutex_buf[i]);
+		  turn_free(mutex_buf[i],sizeof(pthread_mutex_t));
+		  mutex_buf[i] = NULL;
+	  }
+  }
+  turn_free(mutex_buf,CRYPTO_num_locks() * sizeof(pthread_mutex_t*));
   mutex_buf = NULL;
 
 #endif
diff --git a/src/ns_turn_defs.h b/src/ns_turn_defs.h
index 4c3d2a23..bb136d3f 100644
--- a/src/ns_turn_defs.h
+++ b/src/ns_turn_defs.h
@@ -31,7 +31,7 @@
 #ifndef __IOADEFS__
 #define __IOADEFS__
 
-#define TURN_SERVER_VERSION "4.3.1.2"
+#define TURN_SERVER_VERSION "4.3.1.3"
 #define TURN_SERVER_VERSION_NAME "Tolomei"
 #define TURN_SOFTWARE "Coturn-" TURN_SERVER_VERSION " '" TURN_SERVER_VERSION_NAME "'"
 
diff --git a/src/server/ns_turn_server.c b/src/server/ns_turn_server.c
index 99ad1dfd..b8968a9c 100644
--- a/src/server/ns_turn_server.c
+++ b/src/server/ns_turn_server.c
@@ -4623,24 +4623,23 @@ int open_client_connection_session(turn_turnserver* server,
 static void peer_input_handler(ioa_socket_handle s, int event_type,
 		ioa_net_data *in_buffer, void *arg, int can_resume) {
 
-	if (!(event_type & IOA_EV_READ) || !arg)
-		return;
+	if (!(event_type & IOA_EV_READ) || !arg) return;
 
-	if(in_buffer->recv_ttl==0)
-		return;
+	if(in_buffer->recv_ttl==0) return;
 
-	UNUSED_ARG(s);
 	UNUSED_ARG(can_resume);
 
+	if(ioa_socket_tobeclosed(s)) return;
+
 	ts_ur_super_session* ss = (ts_ur_super_session*) arg;
 
-	if(!ss || !s) return;
+	if(!ss) return;
+
+	if(ss->to_be_closed) return;
 
 	turn_turnserver *server = (turn_turnserver*) (ss->server);
 
-	if (!server) {
-		return;
-	}
+	if (!server) return;
 
 	relay_endpoint_session* elem = get_relay_session_ss(ss, get_ioa_socket_address_family(s));
 	if (elem->s == NULL) {
@@ -4654,8 +4653,6 @@ static void peer_input_handler(ioa_socket_handle s, int event_type,
 
 	if (ilen >= 0) {
 
-		size_t len = (size_t)(ilen);
-
 		allocation* a = get_allocation_ss(ss);
 		if (is_allocation_valid(a)) {
 
@@ -4672,6 +4669,9 @@ static void peer_input_handler(ioa_socket_handle s, int event_type,
 			}
 
 			if (chnum) {
+
+				size_t len = (size_t)(ilen);
+
 				nbh = in_buffer->nbh;
 
 				ioa_network_buffer_add_offset_size(nbh,
@@ -4693,6 +4693,9 @@ static void peer_input_handler(ioa_socket_handle s, int event_type,
 							(int) (chnum));
 				}
 			} else {
+
+				size_t len = 0;
+
 				nbh = ioa_network_buffer_allocate(server->e);
 				stun_init_indication_str(STUN_METHOD_DATA, ioa_network_buffer_data(nbh), &len);
 				stun_attr_add_str(ioa_network_buffer_data(nbh), &len, STUN_ATTRIBUTE_DATA,