app_queue: Fix hint updates, allow dup. hints

A previous patch for ASTERISK_29578 caused a 'leak' of
extension state information across queues, causing the
state of the first member of unrelated queues to be
updated in addition to the correct member. Which queues
and members depended on the order of queues in the
iterator.

Additionally, it is possible to use the same 'hint:' on
multiple queue members, so the update cannot break out
of the update loop early when a match is found.

ASTERISK-29806 #close

Change-Id: If2c1d1cc2a752afd9286d79710fc818596e7a7ad
This commit is contained in:
Steve Davies
2021-12-15 12:23:45 +00:00
committed by Friendly Automation
parent c1d0e23b10
commit 12d2c09dec

View File

@@ -2708,16 +2708,11 @@ static int extension_state_cb(const char *context, const char *exten, struct ast
miter = ao2_iterator_init(q->members, 0); miter = ao2_iterator_init(q->members, 0);
for (; (m = ao2_iterator_next(&miter)); ao2_ref(m, -1)) { for (; (m = ao2_iterator_next(&miter)); ao2_ref(m, -1)) {
if (!strcmp(m->state_context, context) && !strcmp(m->state_exten, exten)) { if (!strcmp(m->state_exten, exten) &&
found = 1; (!strcmp(m->state_context, context) || context_included(m->state_context, context))) {
} else if (!strcmp(m->state_exten, exten) && context_included(m->state_context, context)) {
/* context could be included in m->state_context. We need to check. */ /* context could be included in m->state_context. We need to check. */
found = 1; found = 1;
}
if (found) {
update_status(q, m, device_state); update_status(q, m, device_state);
ao2_ref(m, -1);
break;
} }
} }
ao2_iterator_destroy(&miter); ao2_iterator_destroy(&miter);