diff --git a/channel.c b/channel.c
index 12b423ba96c3b60769bfda179f13ec63ee00f9a0..9296ed10d1fc0c05ec72db208dd1482059e2cb39 100755
--- a/channel.c
+++ b/channel.c
@@ -2203,7 +2203,7 @@ struct ast_channel *ast_request_and_dial(const char *type, int format, void *dat
 struct ast_channel *ast_request(const char *type, int format, void *data, int *cause)
 {
 	struct chanlist *chan;
-	struct ast_channel *c = NULL;
+	struct ast_channel *c;
 	int capabilities;
 	int fmt;
 	int res;
@@ -2212,45 +2212,51 @@ struct ast_channel *ast_request(const char *type, int format, void *data, int *c
 	if (!cause)
 		cause = &foo;
 	*cause = AST_CAUSE_NOTDEFINED;
+
 	if (ast_mutex_lock(&chlock)) {
 		ast_log(LOG_WARNING, "Unable to lock channel list\n");
 		return NULL;
 	}
-	chan = backends;
-	while(chan) {
-		if (!strcasecmp(type, chan->tech->type)) {
-			capabilities = chan->tech->capabilities;
-			fmt = format;
-			res = ast_translator_best_choice(&fmt, &capabilities);
-			if (res < 0) {
-				ast_log(LOG_WARNING, "No translator path exists for channel type %s (native %d) to %d\n", type, chan->tech->capabilities, format);
-				ast_mutex_unlock(&chlock);
-				return NULL;
-			}
+
+	for (chan = backends; chan; chan = chan->next) {
+		if (strcasecmp(type, chan->tech->type))
+			continue;
+
+		capabilities = chan->tech->capabilities;
+		fmt = format;
+		res = ast_translator_best_choice(&fmt, &capabilities);
+		if (res < 0) {
+			ast_log(LOG_WARNING, "No translator path exists for channel type %s (native %d) to %d\n", type, chan->tech->capabilities, format);
 			ast_mutex_unlock(&chlock);
-			if (chan->tech->requester)
-				c = chan->tech->requester(type, capabilities, data, cause);
-			if (c) {
-				if (c->_state == AST_STATE_DOWN) {
-					manager_event(EVENT_FLAG_CALL, "Newchannel",
-					"Channel: %s\r\n"
-					"State: %s\r\n"
-					"CallerID: %s\r\n"
-					"CallerIDName: %s\r\n"
-					"Uniqueid: %s\r\n",
-					c->name, ast_state2str(c->_state), c->cid.cid_num ? c->cid.cid_num : "<unknown>", c->cid.cid_name ? c->cid.cid_name : "<unknown>",c->uniqueid);
-				}
-			}
-			return c;
+			return NULL;
 		}
-		chan = chan->next;
-	}
-	if (!chan) {
-		ast_log(LOG_WARNING, "No channel type registered for '%s'\n", type);
-		*cause = AST_CAUSE_NOSUCHDRIVER;
+		ast_mutex_unlock(&chlock);
+		if (!chan->tech->requester)
+			return NULL;
+		
+		if (!(c = chan->tech->requester(type, capabilities, data, cause)))
+			return NULL;
+
+		if (c->_state == AST_STATE_DOWN) {
+			manager_event(EVENT_FLAG_CALL, "Newchannel",
+				      "Channel: %s\r\n"
+				      "State: %s\r\n"
+				      "CallerID: %s\r\n"
+				      "CallerIDName: %s\r\n"
+				      "Uniqueid: %s\r\n",
+				      c->name, ast_state2str(c->_state),
+				      c->cid.cid_num ? c->cid.cid_num : "<unknown>",
+				      c->cid.cid_name ? c->cid.cid_name : "<unknown>",
+				      c->uniqueid);
+		}
+		return c;
 	}
+
+	ast_log(LOG_WARNING, "No channel type registered for '%s'\n", type);
+	*cause = AST_CAUSE_NOSUCHDRIVER;
 	ast_mutex_unlock(&chlock);
-	return c;
+
+	return NULL;
 }
 
 int ast_call(struct ast_channel *chan, char *addr, int timeout) 
diff --git a/frame.c b/frame.c
index 428a052f2b39994a52e30305ba1bcad3208da86b..27afa34ce4abe49ea1d47f4bd379cf1afcbcb945 100755
--- a/frame.c
+++ b/frame.c
@@ -1001,36 +1001,36 @@ int ast_codec_choose(struct ast_codec_pref *pref, int formats, int find_best)
    	return find_best ? ast_best_codec(formats) : 0;
 }
 
-void ast_parse_allow_disallow(struct ast_codec_pref *pref, int *mask, char *list, int allowing) 
+void ast_parse_allow_disallow(struct ast_codec_pref *pref, int *mask, const char *list, int allowing) 
 {
-	int format_i = 0;
-	char *next_format = NULL, *last_format = NULL;
-
-	last_format = ast_strdupa(list);
-	while(last_format) {
-		if((next_format = strchr(last_format, ','))) {
-			*next_format = '\0';
-			next_format++;
+	char *parse;
+	char *this;
+	int format;
+
+	parse = ast_strdupa(list);
+	while ((this = strsep(&parse, ","))) {
+		if (!(format = ast_getformatbyname(this))) {
+			ast_log(LOG_WARNING, "Cannot %s unknown format '%s'\n", allowing ? "allow" : "disallow", this);
+			continue;
+		}
+
+		if (mask) {
+			if (allowing)
+				*mask |= format;
+			else
+				*mask &= ~format;
 		}
-		if ((format_i = ast_getformatbyname(last_format)) > 0) {
-			if (mask) {
+
+		if (pref) {
+			if (strcasecmp(this, "all")) {
 				if (allowing)
-					(*mask) |= format_i;
+					ast_codec_pref_append(pref, format);
 				else
-					(*mask) &= ~format_i;
+					ast_codec_pref_remove(pref, format);
+			} else if (!allowing) {
+				memset(pref, 0, sizeof(*pref));
 			}
-			/* can't consider 'all' a prefered codec*/
-			if(pref && strcasecmp(last_format, "all")) {
-				if(allowing)
-					ast_codec_pref_append(pref, format_i);
-				else
-					ast_codec_pref_remove(pref, format_i);
-			} else if(!allowing) /* disallow all must clear your prefs or it makes no sense */
-				memset(pref, 0, sizeof(struct ast_codec_pref));
-		} else
-			ast_log(LOG_WARNING, "Cannot %s unknown format '%s'\n", allowing ? "allow" : "disallow", last_format);
-
-		last_format = next_format;
+		}
 	}
 }
 
diff --git a/include/asterisk/frame.h b/include/asterisk/frame.h
index 80af31ad57697d611f40f87d85521575a5d87fcb..47ec5a9842d6b1484824d3faaf38b865cc7a4dca 100755
--- a/include/asterisk/frame.h
+++ b/include/asterisk/frame.h
@@ -399,7 +399,7 @@ extern int ast_codec_pref_append(struct ast_codec_pref *pref, int format);
 extern int ast_codec_choose(struct ast_codec_pref *pref, int formats, int find_best);
 
 /* Parse an "allow" or "deny" line and update the mask and pref if provided */
-extern void ast_parse_allow_disallow(struct ast_codec_pref *pref, int *mask, char *list, int allowing);
+extern void ast_parse_allow_disallow(struct ast_codec_pref *pref, int *mask, const char *list, int allowing);
 
 /* Dump codec preference list into a string */
 extern int ast_codec_pref_string(struct ast_codec_pref *pref, char *buf, size_t size);