diff options
author | Corey Farrell <git@cfware.com> | 2017-12-18 21:12:47 -0500 |
---|---|---|
committer | Corey Farrell <git@cfware.com> | 2017-12-19 16:43:32 -0500 |
commit | 9adffca9c786c3b62eefd9de519287b9801f9fec (patch) | |
tree | b0345aa0e012411c0ddaed4d8c570af2a052e755 /pbx | |
parent | dba037d42263288d80a8c98a8b010d7f6721305a (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.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/pbx/pbx_config.c b/pbx/pbx_config.c index c4a0e6c28..1a1c73c64 100644 --- a/pbx/pbx_config.c +++ b/pbx/pbx_config.c @@ -303,8 +303,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 = strdup(i_name); + break; + } } ast_unlock_context(c); } @@ -1523,17 +1525,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 = strdup(ast_get_context_name(c)); ast_unlock_context(c); } ast_unlock_contexts(); free(dupline); - return NULL; + return ret; } return NULL; |