]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
app_queue: Fix hint updates, allow dup. hints
authorSteve Davies <steve@one47.co.uk>
Wed, 15 Dec 2021 12:23:45 +0000 (12:23 +0000)
committerJoshua Colp <jcolp@sangoma.com>
Wed, 5 Jan 2022 14:07:57 +0000 (08:07 -0600)
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

apps/app_queue.c

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