[asterisk-commits] rmudgett: branch 1.8 r337007 - /branches/1.8/channels/sig_ss7.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Sep 20 14:10:32 CDT 2011


Author: rmudgett
Date: Tue Sep 20 14:10:30 2011
New Revision: 337007

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=337007
Log:
Check if a channel was created before using the pointer in sig_ss7_new_ast_channel().

Fixes the crash in ASTERISK-17955 gdb-11918.txt backtrace.

* Added some missing libss7 access lock protection.

* Prevent cancelling the ss7_linkset() thread at inoportune times just
like the pri_dchannel() thread.

(issue ASTERISK-17955)
Reported by: Ian M Sherman
Patches:
      jira_asterisk_17955_v1.8.patch (license #5621) patch uploaded by rmudgett
      (attached to related ASTERISK-17966)

Modified:
    branches/1.8/channels/sig_ss7.c

Modified: branches/1.8/channels/sig_ss7.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/sig_ss7.c?view=diff&rev=337007&r1=337006&r2=337007
==============================================================================
--- branches/1.8/channels/sig_ss7.c (original)
+++ branches/1.8/channels/sig_ss7.c Tue Sep 20 14:10:30 2011
@@ -205,6 +205,9 @@
 	if (p->calls->new_ast_channel) {
 		ast = p->calls->new_ast_channel(p->chan_pvt, state, ulaw, exten, requestor);
 	} else {
+		return NULL;
+	}
+	if (!ast) {
 		return NULL;
 	}
 
@@ -608,8 +611,12 @@
 	unsigned int dpc;
 	int nextms = 0;
 
+	pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
+
 	ss7_set_debug(ss7, SIG_SS7_DEBUG_DEFAULT);
+	ast_mutex_lock(&linkset->lock);
 	ss7_start(ss7);
+	ast_mutex_unlock(&linkset->lock);
 
 	for (;;) {
 		ast_mutex_lock(&linkset->lock);
@@ -628,15 +635,20 @@
 			nextms = tv.tv_sec * 1000;
 			nextms += tv.tv_usec / 1000;
 		}
-		ast_mutex_unlock(&linkset->lock);
 
 		for (i = 0; i < linkset->numsigchans; i++) {
 			pollers[i].fd = linkset->fds[i];
 			pollers[i].events = ss7_pollflags(ss7, linkset->fds[i]);
 			pollers[i].revents = 0;
 		}
-
+		ast_mutex_unlock(&linkset->lock);
+
+		pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
+		pthread_testcancel();
 		res = poll(pollers, linkset->numsigchans, nextms);
+		pthread_testcancel();
+		pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
+
 		if ((res < 0) && (errno != EINTR)) {
 			ast_log(LOG_ERROR, "poll(%s)\n", strerror(errno));
 		} else if (!res) {
@@ -1537,8 +1549,11 @@
 		ast_debug(1,"Received AST_CONTROL_PROCEEDING on %s\n",chan->name);
 		/* This IF sends the FAR for an answered ALEG call */
 		if (chan->_state == AST_STATE_UP && (p->rlt != 1)){
-			if ((isup_far(p->ss7->ss7, p->ss7call)) != -1)
+			ss7_grab(p, p->ss7);
+			if ((isup_far(p->ss7->ss7, p->ss7call)) != -1) {
 				p->rlt = 1;
+			}
+			ss7_rel(p->ss7);
 		}
 
 		if (p->call_level < SIG_SS7_CALL_LEVEL_PROCEEDING && !p->outgoing) {




More information about the asterisk-commits mailing list