summaryrefslogtreecommitdiff
path: root/pbx
diff options
context:
space:
mode:
authorCorey Farrell <git@cfware.com>2017-12-18 21:12:47 -0500
committerCorey Farrell <git@cfware.com>2017-12-19 16:43:49 -0500
commitd51837a1b91cf8bcbf1e61f26d2e9b140ecc7cdb (patch)
treea761a408ce381351d17b87668ccef02ca7588b38 /pbx
parent204dd027dd65125761194ec6a52c02883fd64eb1 (diff)
CLI: Address multiple issues.
* listen uses the variable `s` for the result from ast_poll() then overwrites it with the result of accept(). Create a separate variable poll_result to avoid confusion since ast_poll does not return a file descriptor. * Resolve fd leak that would occur if setsockopt failed in listen. * Reserve an extra byte while processing completion results from remote daemon. This fixes a bug where completion processing used strstr() on a string that was not '\0' terminated. This was no risk to the Asterisk daemon, the bug was only reachable the remote console process. * Resolve leak in handle_showchan when the channel is not found. * Multiple leaks and a deadlock in pbx_config CLI completion. * Fix leaks in "manager show command". Change-Id: I8f633ceb1714867ae30ef4e421858f77c14485a9
Diffstat (limited to 'pbx')
-rw-r--r--pbx/pbx_config.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/pbx/pbx_config.c b/pbx/pbx_config.c
index b96914ded..72e9f578c 100644
--- a/pbx/pbx_config.c
+++ b/pbx/pbx_config.c
@@ -322,8 +322,10 @@ static char *complete_dialplan_remove_include(struct ast_cli_args *a)
while ( (nc = ast_walk_contexts(nc)) && nc != c && !already_served)
already_served = lookup_ci(nc, i_name);
- if (!already_served && ++which > a->n)
+ if (!already_served && ++which > a->n) {
res = ast_strdup(i_name);
+ break;
+ }
}
ast_unlock_context(c);
}
@@ -1549,17 +1551,21 @@ static char *complete_dialplan_remove_ignorepat(struct ast_cli_args *a)
}
for (c = NULL; !ret && (c = ast_walk_contexts(c)); ) {
- if (ast_rdlock_context(c)) /* fail, skip it */
+ if (ast_rdlock_context(c)) {
+ /* fail, skip it */
continue;
- if (!partial_match(ast_get_context_name(c), a->word, len))
+ }
+ if (!partial_match(ast_get_context_name(c), a->word, len)) {
+ ast_unlock_context(c);
continue;
+ }
if (lookup_c_ip(c, ignorepat) && ++which > a->n)
ret = ast_strdup(ast_get_context_name(c));
ast_unlock_context(c);
}
ast_unlock_contexts();
ast_free(dupline);
- return NULL;
+ return ret;
}
return NULL;