[Asterisk-cvs] asterisk/channels chan_iax2.c,1.150,1.151 chan_sip.c,1.406,1.407

markster at lists.digium.com markster at lists.digium.com
Wed Jun 9 18:04:40 CDT 2004


Update of /usr/cvsroot/asterisk/channels
In directory mongoose.digium.com:/tmp/cvs-serv18329/channels

Modified Files:
	chan_iax2.c chan_sip.c 
Log Message:
Although I can't think of any scenario that it could result in a race, don't hold a private iax or sip lock while allocating a channel


Index: chan_iax2.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_iax2.c,v
retrieving revision 1.150
retrieving revision 1.151
diff -u -d -r1.150 -r1.151
--- chan_iax2.c	9 Jun 2004 01:45:07 -0000	1.150
+++ chan_iax2.c	9 Jun 2004 23:07:55 -0000	1.151
@@ -2497,11 +2497,16 @@
 	return res;
 }
 
-static struct ast_channel *ast_iax2_new(struct chan_iax2_pvt *i, int state, int capability)
+static struct ast_channel *ast_iax2_new(int callno, int state, int capability)
 {
 	struct ast_channel *tmp;
+	struct chan_iax2_pvt *i;
+	/* Don't hold call lock */
+	ast_mutex_unlock(&iaxsl[callno]);
 	tmp = ast_channel_alloc(1);
-	if (tmp) {
+	ast_mutex_lock(&iaxsl[callno]);
+	i = iaxs[callno];
+	if (i && tmp) {
 		if (!ast_strlen_zero(i->username))
 			snprintf(tmp->name, sizeof(tmp->name), "IAX2[%s@%s]/%d", i->username, i->host, i->callno);
 		else
@@ -5061,7 +5066,7 @@
 								if (option_verbose > 2) 
 									ast_verbose(VERBOSE_PREFIX_3 "Accepting unauthenticated call from %s, requested format = %d, actual format = %d\n", 
 										inet_ntoa(sin.sin_addr), iaxs[fr.callno]->peerformat,format);
-								if(!(c = ast_iax2_new(iaxs[fr.callno], AST_STATE_RING, format)))
+								if(!(c = ast_iax2_new(fr.callno, AST_STATE_RING, format)))
 									iax2_destroy_nolock(fr.callno);
 							} else {
 								iaxs[fr.callno]->state |= IAX_STATE_TBD;
@@ -5332,7 +5337,7 @@
 								ast_verbose(VERBOSE_PREFIX_3 "Accepting AUTHENTICATED call from %s, requested format = %d, actual format = %d\n", 
 									inet_ntoa(sin.sin_addr), iaxs[fr.callno]->peerformat,format);
 							iaxs[fr.callno]->state |= IAX_STATE_STARTED;
-							if(!(c = ast_iax2_new(iaxs[fr.callno], AST_STATE_RING, format)))
+							if(!(c = ast_iax2_new(fr.callno, AST_STATE_RING, format)))
 								iax2_destroy_nolock(fr.callno);
 						} else {
 							iaxs[fr.callno]->state |= IAX_STATE_TBD;
@@ -5359,7 +5364,7 @@
 							ast_verbose(VERBOSE_PREFIX_3 "Accepting DIAL from %s, formats = 0x%x\n", inet_ntoa(sin.sin_addr), iaxs[fr.callno]->peerformat);
 						iaxs[fr.callno]->state |= IAX_STATE_STARTED;
 						send_command(iaxs[fr.callno], AST_FRAME_CONTROL, AST_CONTROL_PROGRESS, 0, NULL, 0, -1);
-						if(!(c = ast_iax2_new(iaxs[fr.callno], AST_STATE_RING, iaxs[fr.callno]->peerformat)))
+						if(!(c = ast_iax2_new(fr.callno, AST_STATE_RING, iaxs[fr.callno]->peerformat)))
 							iax2_destroy_nolock(fr.callno);
 					}
 				}
@@ -5735,7 +5740,7 @@
 	iaxs[callno]->sendani = sendani;
 	iaxs[callno]->maxtime = maxtime;
 	iaxs[callno]->notransfer = notransfer;
-	c = ast_iax2_new(iaxs[callno], AST_STATE_DOWN, capability);
+	c = ast_iax2_new(callno, AST_STATE_DOWN, capability);
 	ast_mutex_unlock(&iaxsl[callno]);
 	if (c) {
 		/* Choose a format we can live with */

Index: chan_sip.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_sip.c,v
retrieving revision 1.406
retrieving revision 1.407
diff -u -d -r1.406 -r1.407
--- chan_sip.c	9 Jun 2004 01:45:08 -0000	1.406
+++ chan_sip.c	9 Jun 2004 23:07:55 -0000	1.407
@@ -1747,7 +1747,10 @@
 {
 	struct ast_channel *tmp;
 	int fmt;
+	ast_mutex_unlock(&i->lock);
+	/* Don't hold a sip pvt lock while we allocate a channel */
 	tmp = ast_channel_alloc(1);
+	ast_mutex_lock(&i->lock);
 	if (tmp) {
 		/* Select our native format based on codec preference until we receive
 		   something from another device to the contrary. */
@@ -7183,7 +7186,9 @@
 	printf("Setting up to call extension '%s' at '%s'\n", ext ? ext : "<none>", host);
 #endif
 	p->prefcodec = format;
+	ast_mutex_lock(&p->lock);
 	tmpc = sip_new(p, AST_STATE_DOWN, host);
+	ast_mutex_unlock(&p->lock);
 	if (!tmpc)
 		sip_destroy(p);
 	ast_update_use_count();




More information about the svn-commits mailing list