mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-12 15:45:18 +00:00
Fix incorrect uses of ao2_find(). Every one of these calls was reading bogus
memory ... git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@82267 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -774,13 +774,15 @@ static int add_to_interfaces(const char *interface)
|
||||
static int interface_exists_global(const char *interface)
|
||||
{
|
||||
struct call_queue *q;
|
||||
struct member *mem;
|
||||
struct member *mem, tmpmem;
|
||||
int ret = 0;
|
||||
|
||||
ast_copy_string(tmpmem.interface, interface, sizeof(tmpmem.interface));
|
||||
|
||||
AST_LIST_LOCK(&queues);
|
||||
AST_LIST_TRAVERSE(&queues, q, list) {
|
||||
ast_mutex_lock(&q->lock);
|
||||
if ((mem = ao2_find(q->members, (char *)interface, 0))) {
|
||||
if ((mem = ao2_find(q->members, &tmpmem, OBJ_POINTER))) {
|
||||
ao2_ref(mem, -1);
|
||||
ret = 1;
|
||||
}
|
||||
@@ -981,7 +983,7 @@ static void queue_set_param(struct call_queue *q, const char *param, const char
|
||||
|
||||
static void rt_handle_member_record(struct call_queue *q, char *interface, const char *membername, const char *penalty_str, const char *paused_str)
|
||||
{
|
||||
struct member *m;
|
||||
struct member *m, tmpmem;
|
||||
int penalty = 0;
|
||||
int paused = 0;
|
||||
|
||||
@@ -998,7 +1000,8 @@ static void rt_handle_member_record(struct call_queue *q, char *interface, const
|
||||
}
|
||||
|
||||
/* Find the member, or the place to put a new one. */
|
||||
m = ao2_find(q->members, interface, 0);
|
||||
ast_copy_string(tmpmem.interface, interface, sizeof(tmpmem.interface));
|
||||
m = ao2_find(q->members, &tmpmem, OBJ_POINTER);
|
||||
|
||||
/* Create a new one if not found, else update penalty */
|
||||
if (!m) {
|
||||
@@ -1636,7 +1639,7 @@ static int compare_weight(struct call_queue *rq, struct member *member)
|
||||
continue;
|
||||
ast_mutex_lock(&q->lock);
|
||||
if (q->count && q->members) {
|
||||
if ((mem = ao2_find(q->members, member->interface, 0))) {
|
||||
if ((mem = ao2_find(q->members, member, OBJ_POINTER))) {
|
||||
ast_log(LOG_DEBUG, "Found matching member %s in queue '%s'\n", mem->interface, q->name);
|
||||
if (q->weight > rq->weight) {
|
||||
ast_log(LOG_DEBUG, "Queue '%s' (weight %d, calls %d) is preferred over '%s' (weight %d, calls %d)\n", q->name, q->weight, q->count, rq->name, rq->weight, rq->count);
|
||||
@@ -2892,9 +2895,11 @@ static void dump_queue_members(struct call_queue *pm_queue)
|
||||
static int remove_from_queue(const char *queuename, const char *interface)
|
||||
{
|
||||
struct call_queue *q;
|
||||
struct member *mem;
|
||||
struct member *mem, tmpmem;
|
||||
int res = RES_NOSUCHQUEUE;
|
||||
|
||||
ast_copy_string(tmpmem.interface, interface, sizeof(tmpmem.interface));
|
||||
|
||||
AST_LIST_LOCK(&queues);
|
||||
AST_LIST_TRAVERSE(&queues, q, list) {
|
||||
ast_mutex_lock(&q->lock);
|
||||
@@ -2903,7 +2908,7 @@ static int remove_from_queue(const char *queuename, const char *interface)
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((mem = ao2_find(q->members, (char *)interface, OBJ_UNLINK))) {
|
||||
if ((mem = ao2_find(q->members, &tmpmem, OBJ_POINTER | OBJ_UNLINK))) {
|
||||
q->membercount--;
|
||||
manager_event(EVENT_FLAG_AGENT, "QueueMemberRemoved",
|
||||
"Queue: %s\r\n"
|
||||
@@ -3905,6 +3910,8 @@ static int reload_queues(void)
|
||||
}
|
||||
for (var = ast_variable_browse(cfg, cat); var; var = var->next) {
|
||||
if (!strcasecmp(var->name, "member")) {
|
||||
struct member tmpmem;
|
||||
|
||||
/* Add a new member */
|
||||
ast_copy_string(parse, var->value, sizeof(parse));
|
||||
|
||||
@@ -3928,7 +3935,8 @@ static int reload_queues(void)
|
||||
membername = interface;
|
||||
|
||||
/* Find the old position in the list */
|
||||
cur = ao2_find(q->members, interface, OBJ_UNLINK);
|
||||
ast_copy_string(tmpmem.interface, interface, sizeof(tmpmem.interface));
|
||||
cur = ao2_find(q->members, &tmpmem, OBJ_POINTER | OBJ_UNLINK);
|
||||
|
||||
newm = create_queue_member(interface, membername, penalty, cur ? cur->paused : 0);
|
||||
ao2_link(q->members, newm);
|
||||
|
Reference in New Issue
Block a user