X-Git-Url: http://www.dolda2000.com/gitweb/?p=ashd.git;a=blobdiff_plain;f=src%2Fcallfcgi.c;h=8d33eef1d3c8f9d00758a178cbefc3cb4fd85f7d;hp=1abe7d3ee815922a3190dc212eac829a1584248b;hb=595adb9922885c2a05bc6917ee8f8f02f496e618;hpb=213ac88bff161bd82257e488aa00ecad29149637 diff --git a/src/callfcgi.c b/src/callfcgi.c index 1abe7d3..8d33eef 100644 --- a/src/callfcgi.c +++ b/src/callfcgi.c @@ -124,9 +124,16 @@ static char *mkanonid(void) return(tmpl); } +static void setupchild(void) +{ + /* PHP appears to not expect to inherit SIGCHLD set to SIG_IGN, so + * reset it for it. */ + signal(SIGCHLD, SIG_DFL); +} + static void startlisten(void) { - int i, fd; + int fd; struct addrinfo *ai, *cai; char *unpath; struct sockaddr_un unm; @@ -204,9 +211,9 @@ static void startlisten(void) exit(1); } if(child == 0) { + setupchild(); dup2(fd, 0); - for(i = 3; i < FD_SETSIZE; i++) - close(i); + close(fd); execvp(*progspec, progspec); flog(LOG_ERR, "callfcgi: %s: %s", *progspec, strerror(errno)); _exit(127); @@ -216,15 +223,14 @@ static void startlisten(void) static void startnolisten(void) { - int i, fd; + int fd; if((child = fork()) < 0) { flog(LOG_ERR, "could not fork: %s", strerror(errno)); exit(1); } if(child == 0) { - for(i = 3; i < FD_SETSIZE; i++) - close(i); + setupchild(); if((fd = open("/dev/null", O_RDONLY)) < 0) { flog(LOG_ERR, "/dev/null: %s", strerror(errno)); _exit(127); @@ -467,8 +473,8 @@ static void mkcgienv(struct hthead *req, struct charbuf *dst) pi = sprintf2("/%s", tmp = pi); free(tmp); } - bufaddenv(dst, "PATH_INFO", pi); - bufaddenv(dst, "SCRIPT_NAME", url); + bufaddenv(dst, "PATH_INFO", "%s", pi); + bufaddenv(dst, "SCRIPT_NAME", "%s", url); bufaddenv(dst, "QUERY_STRING", "%s", qp?qp:""); free(pi); free(url); @@ -684,12 +690,12 @@ static void serve(struct muth *muth, va_list args) char buf[8192]; sfd = reconn(); - is = mtstdopen(fd, 1, 60, "r+"); - os = mtstdopen(sfd, 1, 600, "r+"); + is = mtstdopen(fd, 1, 60, "r+", NULL); + os = mtstdopen(sfd, 1, 600, "r+", NULL); outi = NULL; mtiopipe(&outi, &outo); mtiopipe(&erri, &erro); - mustart(outplex, mtstdopen(dup(sfd), 1, 600, "r+"), outo, FCGI_STDOUT, erro, FCGI_STDERR, NULL); + mustart(outplex, mtstdopen(dup(sfd), 1, 600, "r+", NULL), outo, FCGI_STDOUT, erro, FCGI_STDERR, NULL); mustart(errhandler, erri); if(begreq(os, 1))