diff options
author | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-03-21 18:15:37 +0000 |
---|---|---|
committer | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-03-21 18:15:37 +0000 |
commit | 0d11d91ab640777dc447f6ee0887ea6c47120af4 (patch) | |
tree | ed30f70630b20112ea7fd8915c5b85dcead4ae4b /asterisk.c | |
parent | f037110f96b77f3cc7eef70b1921f0d00f99a7f0 (diff) |
Create ast_safe_system which closes off file descriptors before spawning system() and so on.
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@2514 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'asterisk.c')
-rwxr-xr-x | asterisk.c | 45 |
1 files changed, 41 insertions, 4 deletions
diff --git a/asterisk.c b/asterisk.c index 2811a7cad..5e1d81215 100755 --- a/asterisk.c +++ b/asterisk.c @@ -28,6 +28,7 @@ #include <asterisk/pbx.h> #include <asterisk/enum.h> #include <asterisk/rtp.h> +#include <asterisk/app.h> #include <sys/resource.h> #include <fcntl.h> #include <stdio.h> @@ -153,6 +154,42 @@ static int fdprint(int fd, const char *s) return write(fd, s, strlen(s) + 1); } +int ast_safe_system(const char *s) +{ + /* XXX This function needs some optimization work XXX */ + pid_t pid; + int x; + int res; + struct rusage rusage; + int status; + pid = fork(); + if (pid == 0) { + /* Close file descriptors and launch system command */ + for (x=STDERR_FILENO + 1; x<4096;x++) { + close(x); + } + res = system(s); + exit(res); + } else if (pid > 0) { + for(;;) { + res = wait4(pid, &status, 0, &rusage); + if (res > -1) { + if (WIFEXITED(status)) + res = WEXITSTATUS(status); + else + res = -1; + } else { + if (errno != EINTR) + break; + } + } + } else { + ast_log(LOG_WARNING, "Fork failed: %s\n", strerror(errno)); + res = -1; + } + return res; +} + /* * write the string to all attached console clients */ @@ -607,9 +644,9 @@ static void consolehandler(char *s) /* The real handler for bang */ if (s[0] == '!') { if (s[1]) - system(s+1); + ast_safe_system(s+1); else - system(getenv("SHELL") ? getenv("SHELL") : "/bin/sh"); + ast_safe_system(getenv("SHELL") ? getenv("SHELL") : "/bin/sh"); } else ast_cli_command(STDOUT_FILENO, s); } else @@ -627,9 +664,9 @@ static int remoteconsolehandler(char *s) /* The real handler for bang */ if (s[0] == '!') { if (s[1]) - system(s+1); + ast_safe_system(s+1); else - system(getenv("SHELL") ? getenv("SHELL") : "/bin/sh"); + ast_safe_system(getenv("SHELL") ? getenv("SHELL") : "/bin/sh"); ret = 1; } if ((strncasecmp(s, "quit", 4) == 0 || strncasecmp(s, "exit", 4) == 0) && |