[svn-commits] lmadsen: tag 1.8.4.1 r320221 - in /tags/1.8.4.1: ChangeLog channels/chan_sip.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Fri May 20 14:28:28 CDT 2011


Author: lmadsen
Date: Fri May 20 14:28:16 2011
New Revision: 320221

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=320221
Log:
Merge changes for issue #19182 and update the ChangeLog.

Modified:
    tags/1.8.4.1/ChangeLog
    tags/1.8.4.1/channels/chan_sip.c

Modified: tags/1.8.4.1/ChangeLog
URL: http://svnview.digium.com/svn/asterisk/tags/1.8.4.1/ChangeLog?view=diff&rev=320221&r1=320220&r2=320221
==============================================================================
--- tags/1.8.4.1/ChangeLog (original)
+++ tags/1.8.4.1/ChangeLog Fri May 20 14:28:16 2011
@@ -26,6 +26,36 @@
 	handling.
 
 	(closes issue 0018951)
+
+	r319142 | mnicholson | 2011-05-16 10:53:27 -0500 (Mon, 16 May 2011) | 8 lines
+
+	Make sure tcptls_session exists before dereferencing it.
+
+	(closes issue 0019192)
+	Reported by: stknob
+	Patches:
+	      10-tcptls-unreachable-peer-segfault.patch uploaded by Chainsaw
+	      (license 723)
+	      Tested by: vois, Chainsaw
+
+	r320180 | mnicholson | 2011-05-20 13:48:46 -0500 (Fri, 20 May 2011) |
+	16 lines
+
+	This commit modifies the way polling is done on TLS sockets.
+
+	Because of the buffering the TLS layer does, polling is unreliable. If
+	poll is called while there is data waiting to be read in the TLS layer but not
+	at the network layer, the messaging processing engine will not proceed until
+	something else writes data to the socket, which may not occur. This change
+	modifies the logic around TLS sockets to only poll after a failed read on a
+	non-blocking socket. This way we know that there is no data waiting to be read from
+	the buffering layer.
+
+	(closes issue #19182)
+	Reported by: st
+	Patches:
+	      ssl-poll-fix3.diff uploaded by mnicholson (license 96)
+	      Tested by: mnicholson
 
 2011-05-09  Leif Madsen <lmadsen at digium.com>
 

Modified: tags/1.8.4.1/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/tags/1.8.4.1/channels/chan_sip.c?view=diff&rev=320221&r1=320220&r2=320221
==============================================================================
--- tags/1.8.4.1/channels/chan_sip.c (original)
+++ tags/1.8.4.1/channels/chan_sip.c Fri May 20 14:28:16 2011
@@ -2472,7 +2472,7 @@
 */
 static void *_sip_tcp_helper_thread(struct sip_pvt *pvt, struct ast_tcptls_session_instance *tcptls_session)
 {
-	int res, cl, timeout = -1, authenticated = 0, flags;
+	int res, cl, timeout = -1, authenticated = 0, flags, after_poll = 0, need_poll = 1;
 	time_t start;
 	struct sip_request req = { 0, } , reqcpy = { 0, };
 	struct sip_threadinfo *me = NULL;
@@ -2579,6 +2579,7 @@
 		/* handle the socket event, check for both reads from the socket fd,
 		 * and writes from alert_pipe fd */
 		if (fds[0].revents) { /* there is data on the socket to be read */
+			after_poll = 1;
 
 			fds[0].revents = 0;
 
@@ -2619,22 +2620,35 @@
 					timeout = -1;
 				}
 
-				res = ast_wait_for_input(tcptls_session->fd, timeout);
-				if (res < 0) {
-					ast_debug(2, "SIP %s server :: ast_wait_for_input returned %d\n", tcptls_session->ssl ? "SSL": "TCP", res);
-					goto cleanup;
-				} else if (res == 0) {
-					/* timeout */
-					ast_debug(2, "SIP %s server timed out\n", tcptls_session->ssl ? "SSL": "TCP");
-					goto cleanup;
+				/* special polling behavior is required for TLS
+				 * sockets because of the buffering done in the
+				 * TLS layer */
+				if (!tcptls_session->ssl || need_poll) {
+					need_poll = 0;
+					after_poll = 1;
+					res = ast_wait_for_input(tcptls_session->fd, timeout);
+					if (res < 0) {
+						ast_debug(2, "SIP TCP server :: ast_wait_for_input returned %d\n", res);
+						goto cleanup;
+					} else if (res == 0) {
+						/* timeout */
+						ast_debug(2, "SIP TCP server timed out\n");
+						goto cleanup;
+					}
 				}
 
 				ast_mutex_lock(&tcptls_session->lock);
 				if (!fgets(buf, sizeof(buf), tcptls_session->f)) {
 					ast_mutex_unlock(&tcptls_session->lock);
-					goto cleanup;
+					if (after_poll) {
+						goto cleanup;
+					} else {
+						need_poll = 1;
+						continue;
+					}
 				}
 				ast_mutex_unlock(&tcptls_session->lock);
+				after_poll = 0;
 				if (me->stop) {
 					 goto cleanup;
 				}
@@ -2653,30 +2667,40 @@
 						}
 
 						if (timeout == 0) {
-							ast_debug(2, "SIP %s server timed out", tcptls_session->ssl ? "SSL": "TCP");
+							ast_debug(2, "SIP %s server timed out\n", tcptls_session->ssl ? "SSL": "TCP");
 							goto cleanup;
 						}
 					} else {
 						timeout = -1;
 					}
 
-					res = ast_wait_for_input(tcptls_session->fd, timeout);
-					if (res < 0) {
-						ast_debug(2, "SIP %s server :: ast_wait_for_input returned %d\n", tcptls_session->ssl ? "SSL": "TCP", res);
-						goto cleanup;
-					} else if (res == 0) {
-						/* timeout */
-						ast_debug(2, "SIP %s server timed out", tcptls_session->ssl ? "SSL": "TCP");
-						goto cleanup;
+					if (!tcptls_session->ssl || need_poll) {
+						need_poll = 0;
+						after_poll = 1;
+						res = ast_wait_for_input(tcptls_session->fd, timeout);
+						if (res < 0) {
+							ast_debug(2, "SIP TCP server :: ast_wait_for_input returned %d\n", res);
+							goto cleanup;
+						} else if (res == 0) {
+							/* timeout */
+							ast_debug(2, "SIP TCP server timed out\n");
+							goto cleanup;
+						}
 					}
 
 					ast_mutex_lock(&tcptls_session->lock);
 					if (!(bytes_read = fread(buf, 1, MIN(sizeof(buf) - 1, cl), tcptls_session->f))) {
 						ast_mutex_unlock(&tcptls_session->lock);
-						goto cleanup;
+						if (after_poll) {
+							goto cleanup;
+						} else {
+							need_poll = 1;
+							continue;
+						}
 					}
 					buf[bytes_read] = '\0';
 					ast_mutex_unlock(&tcptls_session->lock);
+					after_poll = 0;
 					if (me->stop) {
 						goto cleanup;
 					}




More information about the svn-commits mailing list