diff options
author | Corey Farrell <git@cfware.com> | 2017-12-07 11:35:39 -0500 |
---|---|---|
committer | Corey Farrell <git@cfware.com> | 2017-12-07 12:27:00 -0500 |
commit | b8a063f4bf5e0236e55f0fa58dbdf17aa4085584 (patch) | |
tree | 78361e0a5fcf5b7a71a8b0fa0febc03f32923640 | |
parent | d5b58791573b53a140f1d857162e4af64ea1065c (diff) |
CLI: Fix remote console completion.
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
-rw-r--r-- | main/asterisk.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/main/asterisk.c b/main/asterisk.c index 2c86d1ebc..4ba621c84 100644 --- a/main/asterisk.c +++ b/main/asterisk.c @@ -3012,19 +3012,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; } @@ -3036,7 +3043,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; } |