From: Fredrik Tolf Date: Wed, 15 Oct 2014 00:41:53 +0000 (+0200) Subject: call[fs]cgi: Reset SIGCHLD to SIG_DFL before exec'ing children. X-Git-Url: http://www.dolda2000.com/gitweb/?p=ashd.git;a=commitdiff_plain;h=b1b0fe0f4793825232288427da4856e9adf8b868 call[fs]cgi: Reset SIGCHLD to SIG_DFL before exec'ing children. --- diff --git a/src/callfcgi.c b/src/callfcgi.c index 1abe7d3..3dc23c0 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); diff --git a/src/callscgi.c b/src/callscgi.c index 6d72f0e..48d2362 100644 --- a/src/callscgi.c +++ b/src/callscgi.c @@ -111,9 +111,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; @@ -191,9 +198,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, "callscgi: %s: %s", *progspec, strerror(errno)); _exit(127); @@ -203,15 +210,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);