Fix a couple of places in res_agi where the agi_commands lock would not be
authorRussell Bryant <russell@russellbryant.com>
Tue, 15 Jul 2008 18:46:40 +0000 (18:46 +0000)
committerRussell Bryant <russell@russellbryant.com>
Tue, 15 Jul 2008 18:46:40 +0000 (18:46 +0000)
released, causing a deadlock.  (Reported by mvanbaak in #asterisk-dev,
discovered by bbryant's change to the lock tracking code to yell at you
if a thread exits with a lock still held)

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

res/res_agi.c

index b509ef6..0f59855 100644 (file)
@@ -2434,8 +2434,10 @@ static agi_command *find_command(char *cmds[], int exact)
                        if (!e->cmda[y] && !exact)
                                break;
                        /* don't segfault if the next part of a command doesn't exist */
-                       if (!e->cmda[y])
+                       if (!e->cmda[y]) {
+                               AST_RWLIST_UNLOCK(&agi_commands);
                                return NULL;
+                       }
                        if (strcasecmp(e->cmda[y], cmds[y]))
                                match = 0;
                }
@@ -2443,8 +2445,10 @@ static agi_command *find_command(char *cmds[], int exact)
                   a candidate (unless we're looking for a really inexact answer  */
                if ((exact > -1) && e->cmda[y])
                        match = 0;
-               if (match)
+               if (match) {
+                       AST_RWLIST_UNLOCK(&agi_commands);
                        return e;
+               }
        }
        AST_RWLIST_UNLOCK(&agi_commands);
        return NULL;