From: Richard Mudgett Date: Thu, 11 Aug 2011 21:42:21 +0000 (+0000) Subject: Merged revisions 331575 via svnmerge from X-Git-Tag: 10.0.0-beta2~139 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ed72dd52a8fcf4f383eb012ae4dcb86241f12e41;p=thirdparty%2Fasterisk.git 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/branches/10@331576 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/funcs/func_shell.c b/funcs/func_shell.c index 1f274b83d5..2f34f62ab8 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