]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
CLI: Fix remote console completion.
authorCorey Farrell <git@cfware.com>
Thu, 7 Dec 2017 16:35:39 +0000 (11:35 -0500)
committerCorey Farrell <git@cfware.com>
Thu, 7 Dec 2017 17:26:50 +0000 (11:26 -0600)
Duplicate checking was done incorrectly when parsing completion options
from a remote console causing all options to be ignored as duplicates.
Once fixed I had to separate processing of the best match to ensure it
was not identified as a duplicate when it is the only match.

ASTERISK-27465

Change-Id: Ibbdb29f88211742071836c9b3f4d2aa1221cd0f9

main/asterisk.c

index 0abb3600db326f5613f50159b0df9ed991c3b553..bc78687d20bb42efc195240d20ccfcbf116638f0 100644 (file)
@@ -3133,19 +3133,26 @@ static char *cli_prompt(EditLine *editline)
 static struct ast_vector_string *ast_el_strtoarr(char *buf)
 {
        char *retstr;
+       char *bestmatch;
        struct ast_vector_string *vec = ast_calloc(1, sizeof(*vec));
 
        if (!vec) {
                return NULL;
        }
 
+       /* bestmatch must not be deduplicated */
+       bestmatch = strsep(&buf, " ");
+       if (!bestmatch || !strcmp(bestmatch, AST_CLI_COMPLETE_EOF)) {
+               goto vector_cleanup;
+       }
+
        while ((retstr = strsep(&buf, " "))) {
                if (!strcmp(retstr, AST_CLI_COMPLETE_EOF)) {
                        break;
                }
 
                /* Older daemons sent duplicates. */
-               if (AST_VECTOR_GET_CMP(vec, retstr, strcasecmp)) {
+               if (AST_VECTOR_GET_CMP(vec, retstr, !strcasecmp)) {
                        continue;
                }
 
@@ -3157,7 +3164,9 @@ static struct ast_vector_string *ast_el_strtoarr(char *buf)
                }
        }
 
-       if (!AST_VECTOR_SIZE(vec)) {
+       bestmatch = ast_strdup(bestmatch);
+       if (!bestmatch || AST_VECTOR_INSERT_AT(vec, 0, bestmatch)) {
+               ast_free(bestmatch);
                goto vector_cleanup;
        }