diff options
author | Richard Mudgett <rmudgett@digium.com> | 2011-08-11 21:44:08 +0000 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2011-08-11 21:44:08 +0000 |
commit | e12184cf952d046e29b7aaa3354f4b080e022947 (patch) | |
tree | dcf0695949f353a8d58abf33699ed07be62cd0db /funcs/func_shell.c | |
parent | a6ea606a784ab6376c20faf9f1b0dd31c3bdf6e0 (diff) |
Merged revisions 331576 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/10
................
r331576 | rmudgett | 2011-08-11 16:42:21 -0500 (Thu, 11 Aug 2011) | 16 lines
Merged revisions 331575 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.8
........
r331575 | rmudgett | 2011-08-11 16:39:58 -0500 (Thu, 11 Aug 2011) | 9 lines
Segfault in shell_helper in func_shell.c.
The return value of popen() was not checked for failure to open.
(closes issue ASTERISK-18109)
JIRA SWP-3633
Reported by: Michael Myles
Tested by: rmudgett
........
................
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@331577 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'funcs/func_shell.c')
-rw-r--r-- | funcs/func_shell.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/funcs/func_shell.c b/funcs/func_shell.c index 1f274b83d..2f34f62ab 100644 --- a/funcs/func_shell.c +++ b/funcs/func_shell.c @@ -42,29 +42,38 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") static int shell_helper(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) { + int res = 0; + if (ast_strlen_zero(data)) { ast_log(LOG_WARNING, "Missing Argument! Example: Set(foo=${SHELL(echo \"bar\")})\n"); return -1; } - if (chan) + if (chan) { ast_autoservice_start(chan); + } if (len >= 1) { FILE *ptr; char plbuff[4096]; ptr = popen(data, "r"); - while (fgets(plbuff, sizeof(plbuff), ptr)) { - strncat(buf, plbuff, len - strlen(buf) - 1); + if (ptr) { + while (fgets(plbuff, sizeof(plbuff), ptr)) { + strncat(buf, plbuff, len - strlen(buf) - 1); + } + pclose(ptr); + } else { + ast_log(LOG_WARNING, "Failed to execute shell command '%s'\n", data); + res = -1; } - pclose(ptr); } - if (chan) + if (chan) { ast_autoservice_stop(chan); + } - return 0; + return res; } /*** DOCUMENTATION |