Merged revisions 101433 via svnmerge from
authorRussell Bryant <russell@russellbryant.com>
Thu, 31 Jan 2008 19:20:52 +0000 (19:20 +0000)
committerRussell Bryant <russell@russellbryant.com>
Thu, 31 Jan 2008 19:20:52 +0000 (19:20 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r101433 | russell | 2008-01-31 13:17:05 -0600 (Thu, 31 Jan 2008) | 2 lines

Add more missing locking of the agents list ...

........

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

channels/chan_agent.c

index 36066cb..2aeebf5 100644 (file)
@@ -1507,6 +1507,7 @@ static int agent_logoff(const char *agent, int soft)
        long logintime;
        int ret = -1; /* Return -1 if no agent if found */
 
+       AST_LIST_LOCK(&agents);
        AST_LIST_TRAVERSE(&agents, p, list) {
                if (!strcasecmp(p->agent, agent)) {
                        ret = 0;
@@ -1526,6 +1527,7 @@ static int agent_logoff(const char *agent, int soft)
                        break;
                }
        }
+       AST_LIST_UNLOCK(&agents);
 
        return ret;
 }
@@ -1592,20 +1594,26 @@ static int action_agent_logoff(struct mansession *s, const struct message *m)
 
 static char *complete_agent_logoff_cmd(const char *line, const char *word, int pos, int state)
 {
+       char *ret = NULL;
+
        if (pos == 2) {
                struct agent_pvt *p;
                char name[AST_MAX_AGENT];
                int which = 0, len = strlen(word);
 
+               AST_LIST_LOCK(&agents);
                AST_LIST_TRAVERSE(&agents, p, list) {
                        snprintf(name, sizeof(name), "Agent/%s", p->agent);
-                       if (!strncasecmp(word, name, len) && p->loginstart && ++which > state)
-                               return ast_strdup(name);
+                       if (!strncasecmp(word, name, len) && p->loginstart && ++which > state) {
+                               ret = ast_strdup(name);
+                               break;
+                       }
                }
+               AST_LIST_UNLOCK(&agents);
        } else if (pos == 3 && state == 0) 
                return ast_strdup("soft");
        
-       return NULL;
+       return ret;
 }
 
 /*!