[svn-commits] mmichelson: branch group/issue8824 r184040 - in /team/group/issue8824: apps/ ...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Tue Mar 24 16:47:49 CDT 2009


Author: mmichelson
Date: Tue Mar 24 16:47:45 2009
New Revision: 184040

URL: http://svn.digium.com/svn-view/asterisk?view=rev&rev=184040
Log:
Address Russell's latest round of findings.


Modified:
    team/group/issue8824/apps/app_directed_pickup.c
    team/group/issue8824/apps/app_queue.c
    team/group/issue8824/channels/chan_iax2.c
    team/group/issue8824/channels/chan_sip.c

Modified: team/group/issue8824/apps/app_directed_pickup.c
URL: http://svn.digium.com/svn-view/asterisk/team/group/issue8824/apps/app_directed_pickup.c?view=diff&rev=184040&r1=184039&r2=184040
==============================================================================
--- team/group/issue8824/apps/app_directed_pickup.c (original)
+++ team/group/issue8824/apps/app_directed_pickup.c Tue Mar 24 16:47:45 2009
@@ -100,9 +100,12 @@
 	connected_caller.source = AST_CONNECTED_LINE_UPDATE_SOURCE_ANSWER;
 	ast_channel_update_connected_line(chan, &connected_caller);
 
-	ast_party_connected_line_collect_caller(&connected_caller, &chan->cid);
+	ast_channel_lock(chan);
+	ast_connected_line_copy_from_caller(&connected_caller, &chan->cid);
+	ast_channel_unlock(chan);
 	connected_caller.source = AST_CONNECTED_LINE_UPDATE_SOURCE_ANSWER;
 	ast_channel_queue_connected_line_update(chan, &connected_caller);
+	ast_party_connected_line_free(&connected_caller);
 
 	if ((res = ast_answer(chan))) {
 		ast_log(LOG_WARNING, "Unable to answer '%s'\n", chan->name);

Modified: team/group/issue8824/apps/app_queue.c
URL: http://svn.digium.com/svn-view/asterisk/team/group/issue8824/apps/app_queue.c?view=diff&rev=184040&r1=184039&r2=184040
==============================================================================
--- team/group/issue8824/apps/app_queue.c (original)
+++ team/group/issue8824/apps/app_queue.c Tue Mar 24 16:47:45 2009
@@ -2778,6 +2778,11 @@
 	struct callattempt *epollo;
 #endif
 	struct ast_party_connected_line connected_caller;
+	char *inchan_name;
+
+	ast_channel_lock(qe->chan);
+	inchan_name = ast_strdupa(qe->chan->name);
+	ast_channel_unlock(qe->chan);
 
 	starttime = (long) time(NULL);
 #ifdef HAVE_EPOLL
@@ -2828,9 +2833,16 @@
 		}
 		winner = ast_waitfor_n(watchers, pos, to);
 		for (o = start; o; o = o->call_next) {
+			/* We go with a static buffer here instead of using ast_strdupa. Using
+			 * ast_strdupa in a loop like this one can cause a stack overflow
+			 */
+			char ochan_name[AST_CHANNEL_NAME];
+			ast_channel_lock(o->chan);
+			ast_copy_string(ochan_name, o->chan->name, sizeof(ochan_name));
+			ast_channel_unlock(o->chan);
 			if (o->stillgoing && (o->chan) &&  (o->chan->_state == AST_STATE_UP)) {
 				if (!peer) {
-					ast_verb(3, "%s answered %s\n", o->chan->name, in->name);
+					ast_verb(3, "%s answered %s\n", ochan_name, inchan_name);
 					if (update_connectedline) {
 						if (o->connected.id.number) {
 							ast_channel_update_connected_line(in, &o->connected);
@@ -2851,7 +2863,7 @@
 				ast_copy_string(membername, o->member->membername, sizeof(membername));
 
 				if (!ast_strlen_zero(o->chan->call_forward) && !forwardsallowed) {
-					ast_verb(3, "Forwarding %s to '%s' prevented.\n", in->name, o->chan->call_forward);
+					ast_verb(3, "Forwarding %s to '%s' prevented.\n", inchan_name, o->chan->call_forward);
 					numnochan++;
 					do_hang(o);
 					winner = NULL;
@@ -2874,7 +2886,7 @@
 						tech = "Local";
 					}
 					/* Before processing channel, go ahead and check for forwarding */
-					ast_verb(3, "Now forwarding %s to '%s/%s' (thanks to %s)\n", in->name, tech, stuff, o->chan->name);
+					ast_verb(3, "Now forwarding %s to '%s/%s' (thanks to %s)\n", inchan_name, tech, stuff, ochan_name);
 					/* Setup parameters */
 					o->chan = ast_request(tech, in->nativeformats, stuff, &status);
 					if (!o->chan) {
@@ -2930,7 +2942,7 @@
 						case AST_CONTROL_ANSWER:
 							/* This is our guy if someone answered. */
 							if (!peer) {
-								ast_verb(3, "%s answered %s\n", o->chan->name, in->name);
+								ast_verb(3, "%s answered %s\n", ochan_name, inchan_name);
 								if (update_connectedline) {
 									if (o->connected.id.number) {
 										ast_channel_update_connected_line(in, &o->connected);
@@ -2947,7 +2959,7 @@
 							}
 							break;
 						case AST_CONTROL_BUSY:
-							ast_verb(3, "%s is busy\n", o->chan->name);
+							ast_verb(3, "%s is busy\n", ochan_name);
 							if (in->cdr)
 								ast_cdr_busy(in->cdr);
 							do_hang(o);
@@ -2962,7 +2974,7 @@
 							numbusies++;
 							break;
 						case AST_CONTROL_CONGESTION:
-							ast_verb(3, "%s is circuit-busy\n", o->chan->name);
+							ast_verb(3, "%s is circuit-busy\n", ochan_name);
 							if (in->cdr)
 								ast_cdr_busy(in->cdr);
 							endtime = (long) time(NULL);
@@ -2977,31 +2989,31 @@
 							numbusies++;
 							break;
 						case AST_CONTROL_RINGING:
-							ast_verb(3, "%s is ringing\n", o->chan->name);
+							ast_verb(3, "%s is ringing\n", ochan_name);
 							break;
 						case AST_CONTROL_OFFHOOK:
 							/* Ignore going off hook */
 							break;
 						case AST_CONTROL_CONNECTED_LINE:
 							if (!update_connectedline) {
-								ast_verb(3, "Connected line update to %s prevented.\n", in->name);
+								ast_verb(3, "Connected line update to %s prevented.\n", inchan_name);
 							} else if (qe->parent->strategy == QUEUE_STRATEGY_RINGALL) {
 								struct ast_party_connected_line connected;
-								ast_verb(3, "%s connected line has changed. Saving it until answer for %s\n", o->chan->name, in->name);
+								ast_verb(3, "%s connected line has changed. Saving it until answer for %s\n", ochan_name, inchan_name);
 								ast_party_connected_line_set_init(&connected, &o->connected);
 								ast_connected_line_parse_data(f->data.ptr, f->datalen, &connected);
 								ast_party_connected_line_set(&o->connected, &connected);
 								ast_party_connected_line_free(&connected);
 							} else {
-								ast_verb(3, "%s connected line has changed, passing it to %s\n", o->chan->name, in->name);
+								ast_verb(3, "%s connected line has changed, passing it to %s\n", ochan_name, inchan_name);
 								ast_indicate_data(in, AST_CONTROL_CONNECTED_LINE, f->data.ptr, f->datalen);
 							}
 							break;
 						case AST_CONTROL_REDIRECTING:
 							if (!update_connectedline) {
-								ast_verb(3, "Redirecting update to %s prevented\n", in->name);
+								ast_verb(3, "Redirecting update to %s prevented\n", inchan_name);
 							} else {
-								ast_verb(3, "%s redirecting info has changed, passing it to %s\n", o->chan->name, in->name);
+								ast_verb(3, "%s redirecting info has changed, passing it to %s\n", ochan_name, inchan_name);
 								ast_indicate_data(in, AST_CONTROL_REDIRECTING, f->data.ptr, f->datalen);
 							}
 							break;

Modified: team/group/issue8824/channels/chan_iax2.c
URL: http://svn.digium.com/svn-view/asterisk/team/group/issue8824/channels/chan_iax2.c?view=diff&rev=184040&r1=184039&r2=184040
==============================================================================
--- team/group/issue8824/channels/chan_iax2.c (original)
+++ team/group/issue8824/channels/chan_iax2.c Tue Mar 24 16:47:45 2009
@@ -11357,12 +11357,8 @@
 	trunkmaxsize = MAX_TRUNKDATA;
 	amaflags = 0;
 	delayreject = 0;
-	ast_clear_flag((&globalflags), IAX_NOTRANSFER);	
-	ast_clear_flag((&globalflags), IAX_TRANSFERMEDIA);	
-	ast_clear_flag((&globalflags), IAX_USEJITTERBUF);	
-	ast_clear_flag((&globalflags), IAX_FORCEJITTERBUF);	
-	ast_clear_flag((&globalflags), IAX_SENDCONNECTEDLINE);
-	ast_clear_flag((&globalflags), IAX_RECVCONNECTEDLINE);
+	ast_clear_flag((&globalflags), IAX_NOTRANSFER | IAX_TRANSFERMEDIA | IAX_USEJITTERBUF |
+		IAX_FORCEJITTERBUF | IAX_SENDCONNECTEDLINE | IAX_RECVCONNECTEDLINE);
 	delete_users();
 }
 

Modified: team/group/issue8824/channels/chan_sip.c
URL: http://svn.digium.com/svn-view/asterisk/team/group/issue8824/channels/chan_sip.c?view=diff&rev=184040&r1=184039&r2=184040
==============================================================================
--- team/group/issue8824/channels/chan_sip.c (original)
+++ team/group/issue8824/channels/chan_sip.c Tue Mar 24 16:47:45 2009
@@ -8811,7 +8811,7 @@
 
 	if (ast_test_flag(&p->flags[0], SIP_SENDRPID)
 			&& ast_test_flag(&p->flags[1], SIP_PAGE2_CONNECTLINEUPDATE_PEND)
-			&& (!strncasecmp(msg, "180", 3) || !strncasecmp(msg, "183", 3))) {
+			&& (!strncmp(msg, "180", 3) || !strncmp(msg, "183", 3))) {
 		ast_clear_flag(&p->flags[1], SIP_PAGE2_CONNECTLINEUPDATE_PEND);
 		add_rpid(&resp, p);
 	}
@@ -9041,7 +9041,7 @@
  */
 static int add_rpid(struct sip_request *req, struct sip_pvt *p)
 {
-	char tmp[256];
+	struct ast_str *tmp = ast_str_alloca(256);
 	char *lid_num = NULL;
 	char *lid_name = NULL;
 	int lid_pres;
@@ -9068,13 +9068,13 @@
 
 	if (ast_test_flag(&p->flags[0], SIP_SENDRPID_PAI)) {
 		if ((lid_pres & AST_PRES_RESTRICTION) != AST_PRES_ALLOWED) {
-			snprintf(tmp, sizeof(tmp), "%s", anonymous_string);
+			ast_str_set(&tmp, -1, "%s", anonymous_string);
 		} else {
-			snprintf(tmp, sizeof(tmp), "\"%s\" <sip:%s@%s>", lid_name, lid_num, fromdomain);
-		}
-		add_header(req, "P-Asserted-Identity", tmp);
+			ast_str_set(&tmp, -1, "\"%s\" <sip:%s@%s>", lid_name, lid_num, fromdomain);
+		}
+		add_header(req, "P-Asserted-Identity", ast_str_buffer(tmp));
 	} else {
-		snprintf(tmp, sizeof(tmp), "\"%s\" <sip:%s@%s>;party=%s", lid_name, lid_num, fromdomain, ast_test_flag(&p->flags[0], SIP_OUTGOING) ? "calling" : "called");
+		ast_str_set(&tmp, -1, "\"%s\" <sip:%s@%s>;party=%s", lid_name, lid_num, fromdomain, ast_test_flag(&p->flags[0], SIP_OUTGOING) ? "calling" : "called");
 
 		switch (lid_pres) {
 		case AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED:
@@ -9109,10 +9109,11 @@
 			break;
 		}
 
-		if (!ast_strlen_zero(privacy) && !ast_strlen_zero(screen))
-			snprintf(tmp + strlen(tmp), sizeof(tmp) - strlen(tmp), ";privacy=%s;screen=%s", privacy, screen);
-
-		add_header(req, "Remote-Party-ID", tmp);
+		if (!ast_strlen_zero(privacy) && !ast_strlen_zero(screen)) {
+			ast_str_append(&tmp, -1, ";privacy=%s;screen=%s", privacy, screen);
+		}
+
+		add_header(req, "Remote-Party-ID", ast_str_buffer(tmp));
 	}
 	return 0;
 }
@@ -10792,7 +10793,7 @@
 static int sip_reregister(const void *data) 
 {
 	/* if we are here, we know that we need to reregister. */
-	struct sip_registry *r= (struct sip_registry *) data;
+	struct sip_registry *r = (struct sip_registry *) data;
 
 	/* if we couldn't get a reference to the registry object, punt */
 	if (!r)




More information about the svn-commits mailing list