diff options
author | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-08-04 22:52:15 +0000 |
---|---|---|
committer | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-08-04 22:52:15 +0000 |
commit | e2f45f8d327eccfb5eca3a42b30012e8730ccb70 (patch) | |
tree | cdcd352c7daa14bbc44b40efba4e6dc9b0fe3521 | |
parent | 57a1c3fdf7b2d7675362c938e3c2e105c3904606 (diff) |
unmask SIGHUP before exec'ing AGI scripts (bug #4854)
git-svn-id: http://svn.digium.com/svn/asterisk/branches/v1-0@6283 f38db490-d61c-443f-a65b-d21fe96a405b
-rwxr-xr-x | CHANGES | 4 | ||||
-rwxr-xr-x | res/res_agi.c | 17 |
2 files changed, 18 insertions, 3 deletions
@@ -24,6 +24,10 @@ -- We now ensure buffer policy is restored after RAS is done with a channel. This could cause audio problems on the channel after zapras is done with it. + -- res_agi + -- We now unmask the SIGHUP signal before executing an AGI script. This + fixes problems where some AGI scripts would continue running long after + the call is over. -- extensions -- A potential crash has been fixed when calling LEN() to get the length of a string that was 80 characters or larger. diff --git a/res/res_agi.c b/res/res_agi.c index 71c636ff8..819470b13 100755 --- a/res/res_agi.c +++ b/res/res_agi.c @@ -203,6 +203,7 @@ static int launch_script(char *script, char *argv[], int *fds, int *efd, int *op int audio[2]; int x; int res; + sigset_t signal_set; if (!strncasecmp(script, "agi://", 6)) return launch_netscript(script, argv, fds, efd, opid); @@ -258,9 +259,17 @@ static int launch_script(char *script, char *argv[], int *fds, int *efd, int *op } else { close(STDERR_FILENO + 1); } + + /* unblock important signal handlers */ + if (sigfillset(&signal_set) || pthread_sigmask(SIG_UNBLOCK, &signal_set, NULL)) { + ast_log(LOG_WARNING, "unable to unblock signals for AGI script: %s\n", strerror(errno)); + exit(1); + } + /* Close everything but stdin/out/error */ for (x=STDERR_FILENO + 2;x<1024;x++) close(x); + /* Execute script */ execv(script, argv); /* Can't use ast_log since FD's are closed */ @@ -433,7 +442,7 @@ static int handle_streamfile(struct ast_channel *chan, AGI *agi, int argc, char return RESULT_SHOWUSAGE; fs = ast_openstream(chan, argv[2], chan->language); - if(!fs){ + if (!fs){ fdprintf(agi->fd, "200 result=%d endpos=%ld\n", 0, sample_offset); return RESULT_SUCCESS; } @@ -1542,8 +1551,10 @@ static int run_agi(struct ast_channel *chan, char *request, AGI *agi, int pid, i } } /* Notify process */ - if (pid > -1) - kill(pid, SIGHUP); + if (pid > -1) { + if (kill(pid, SIGHUP)) + ast_log(LOG_WARNING, "unable to send SIGHUP to AGI process %d: %s\n", pid, strerror(errno)); + } fclose(readf); return returnstatus; } |