mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-06 01:45:11 +00:00
Fix a crash in app_queue with very long member lists.
A user reported via #asterisk that with very long lists of members, a crash occurs in ast_strdupa, so just use a single buffer and ast_copy_string instead of stack allocating copys of each interface name. (Related to revision 191041 in branches/1.4) git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.0@191424 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -696,15 +696,15 @@ static int update_status(const char *interface, const int status)
|
|||||||
struct member *cur;
|
struct member *cur;
|
||||||
struct ao2_iterator mem_iter, queue_iter;
|
struct ao2_iterator mem_iter, queue_iter;
|
||||||
struct call_queue *q;
|
struct call_queue *q;
|
||||||
|
char tmp_interface[80];
|
||||||
|
|
||||||
queue_iter = ao2_iterator_init(queues, 0);
|
queue_iter = ao2_iterator_init(queues, 0);
|
||||||
while ((q = ao2_iterator_next(&queue_iter))) {
|
while ((q = ao2_iterator_next(&queue_iter))) {
|
||||||
ao2_lock(q);
|
ao2_lock(q);
|
||||||
mem_iter = ao2_iterator_init(q->members, 0);
|
mem_iter = ao2_iterator_init(q->members, 0);
|
||||||
while ((cur = ao2_iterator_next(&mem_iter))) {
|
while ((cur = ao2_iterator_next(&mem_iter))) {
|
||||||
char *tmp_interface;
|
|
||||||
char *slash_pos;
|
char *slash_pos;
|
||||||
tmp_interface = ast_strdupa(cur->state_interface);
|
ast_copy_string(tmp_interface, cur->state_interface, sizeof(tmp_interface));
|
||||||
if ((slash_pos = strchr(tmp_interface, '/')))
|
if ((slash_pos = strchr(tmp_interface, '/')))
|
||||||
if (!strncasecmp(tmp_interface, "Local", 5) && (slash_pos = strchr(slash_pos + 1, '/')))
|
if (!strncasecmp(tmp_interface, "Local", 5) && (slash_pos = strchr(slash_pos + 1, '/')))
|
||||||
*slash_pos = '\0';
|
*slash_pos = '\0';
|
||||||
@@ -747,12 +747,12 @@ static int update_status(const char *interface, const int status)
|
|||||||
static void *handle_statechange(struct statechange *sc)
|
static void *handle_statechange(struct statechange *sc)
|
||||||
{
|
{
|
||||||
struct member_interface *curint;
|
struct member_interface *curint;
|
||||||
|
char interface[80];
|
||||||
|
|
||||||
AST_LIST_LOCK(&interfaces);
|
AST_LIST_LOCK(&interfaces);
|
||||||
AST_LIST_TRAVERSE(&interfaces, curint, list) {
|
AST_LIST_TRAVERSE(&interfaces, curint, list) {
|
||||||
char *interface;
|
|
||||||
char *slash_pos;
|
char *slash_pos;
|
||||||
interface = ast_strdupa(curint->interface);
|
ast_copy_string(interface, curint->interface, sizeof(interface));
|
||||||
if ((slash_pos = strchr(interface, '/')))
|
if ((slash_pos = strchr(interface, '/')))
|
||||||
if ((slash_pos = strchr(slash_pos + 1, '/')))
|
if ((slash_pos = strchr(slash_pos + 1, '/')))
|
||||||
*slash_pos = '\0';
|
*slash_pos = '\0';
|
||||||
|
|||||||
Reference in New Issue
Block a user