summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorey Farrell <git@cfware.com>2017-12-07 11:35:39 -0500
committerCorey Farrell <git@cfware.com>2017-12-07 12:27:00 -0500
commitb8a063f4bf5e0236e55f0fa58dbdf17aa4085584 (patch)
tree78361e0a5fcf5b7a71a8b0fa0febc03f32923640
parentd5b58791573b53a140f1d857162e4af64ea1065c (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.c13
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;
}