]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
chan_local: Fix local_pvt ref leak in local_devicestate().
authorRichard Mudgett <rmudgett@digium.com>
Thu, 29 Nov 2012 22:58:28 +0000 (22:58 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Thu, 29 Nov 2012 22:58:28 +0000 (22:58 +0000)
Regression introduced by ASTERISK-20390 fix.

(closes issue ASTERISK-20769)
Reported by: rmudgett
Tested by: rmudgett
........

Merged revisions 376868 from http://svn.asterisk.org/svn/asterisk/branches/1.8

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10@376869 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_local.c

index f81aa956644cb06ab00ce5d6ec0d327818846620..768fafc6a01c0cc31d70935125b9284f2de1e676 100644 (file)
@@ -307,15 +307,20 @@ static int local_devicestate(void *data)
        res = AST_DEVICE_NOT_INUSE;
 
        it = ao2_iterator_init(locals, 0);
-       while ((lp = ao2_iterator_next(&it)) && (res == AST_DEVICE_NOT_INUSE)) {
-               if (!strcmp(exten, lp->exten) && !strcmp(context, lp->context) && lp->owner) {
-                       ao2_lock(lp);
-                       if (ast_test_flag(lp, LOCAL_LAUNCHED_PBX)) {
-                               res = AST_DEVICE_INUSE;
-                       }
-                       ao2_unlock(lp);
+       for (; (lp = ao2_iterator_next(&it)); ao2_ref(lp, -1)) {
+               int is_inuse;
+
+               ao2_lock(lp);
+               is_inuse = !strcmp(exten, lp->exten)
+                       && !strcmp(context, lp->context)
+                       && lp->owner
+                       && ast_test_flag(lp, LOCAL_LAUNCHED_PBX);
+               ao2_unlock(lp);
+               if (is_inuse) {
+                       res = AST_DEVICE_INUSE;
+                       ao2_ref(lp, -1);
+                       break;
                }
-               ao2_ref(lp, -1);
        }
        ao2_iterator_destroy(&it);