diff -r 8827517054ec -r 0d80f8a2b29f src/server/safs/cgi.c --- a/src/server/safs/cgi.c Wed May 31 19:39:10 2023 +0200 +++ b/src/server/safs/cgi.c Sun Jun 04 20:09:18 2023 +0200 @@ -179,7 +179,7 @@ Event *writeev = pool_malloc(sn->pool, sizeof(Event)); ZERO(writeev, sizeof(Event)); writeev->cookie = handler; - // TODO: fn + handler->writeev = writeev; handler->stderrev = stderr_readev; @@ -256,12 +256,13 @@ if(!handler->poll_out) { if(event_pollout(ev, sn->csd, handler->writeev)) { handler->result = REQ_ABORTED; - return 1; + return 0; } handler->poll_out = TRUE; } } else { handler->result = REQ_ABORTED; + log_ereport(LOG_FAILURE, "cgi_try_write: %s", strerror(errno)); } return 1; } @@ -292,8 +293,12 @@ // try to flush handler->writebuf // if writebuf is empty, this does nothing and returns 0 if(cgi_try_write_flush(handler, sn)) { - log_ereport(LOG_DEBUG, "cgi-send: req: %p write failed: abort", rq); - return handler->result == REQ_ABORTED ? 0 : 1; + if(handler->result == REQ_ABORTED) { + log_ereport(LOG_DEBUG, "cgi-send: req: %p write failed: abort", rq); + return 0; + } else { + return 1; + } } char buf[4096]; // I/O buffer @@ -462,9 +467,12 @@ Request *rq = parser->rq; log_ereport(LOG_DEBUG, "cgi-send: req: %p event-finish", rq); - if(handler->result == REQ_ABORTED) { + if(handler->result == REQ_ABORTED && handler->process.pid != 0) { log_ereport(LOG_FAILURE, "cgi-send: kill script: %s", handler->path); - kill(handler->process.pid, SIGKILL); + + killpg(handler->process.pid, SIGTERM); + + handler->process.pid = 0; } if(!handler->stderr_finished) {