# HG changeset patch # User Olaf Wintermann # Date 1477819320 -3600 # Node ID c913d515be1e9d0093e73a0a79c7ef194f0664e3 # Parent 85985e88f63bd5cff9381bd276977cb7f7cc6ce3 adds more error handling diff -r 85985e88f63b -r c913d515be1e src/server/daemon/main.c --- a/src/server/daemon/main.c Sat Oct 29 21:04:10 2016 +0200 +++ b/src/server/daemon/main.c Sun Oct 30 10:22:00 2016 +0100 @@ -152,6 +152,10 @@ signal(SIGUSR1, sig_usr1_reload); signal(SIGTERM, sig_term); signal(SIGINT, sig_term); + + struct sigaction act; + act.sa_handler = SIG_IGN; + sigaction(SIGPIPE, &act, NULL); /* start webserver */ int status; diff -r 85985e88f63b -r c913d515be1e src/server/safs/cgi.c --- a/src/server/safs/cgi.c Sat Oct 29 21:04:10 2016 +0200 +++ b/src/server/safs/cgi.c Sun Oct 30 10:22:00 2016 +0100 @@ -36,6 +36,8 @@ #include "../util/pblock.h" #include "../../ucx/string.h" +#include "../util/io.h" + #include "cgiutils.h" #define CGI_VARS 32 @@ -106,15 +108,16 @@ // read from child CGIResponseParser *parser = cgi_parser_new(sn, rq); WSBool cgiheader = TRUE; - + ssize_t wr = 0; + int result = REQ_PROCEED; while((r = read(cgip.out[0], buf, 4096)) > 0) { if(cgiheader) { size_t pos; int ret = cgi_parse_response(parser, buf, r, &pos); if(ret == -1) { protocol_status(sn, rq, 500, NULL); - cgi_parser_free(parser); - return REQ_ABORTED; + result = REQ_ABORTED; + break; } else if(ret == 0) { } else if(ret == 1) { @@ -124,16 +127,24 @@ } http_start_response(sn, rq); if(pos < r) { - net_write(sn->csd, buf+pos, r-pos); + wr = net_write(sn->csd, &buf[pos], r-pos); + if(wr <= 0) { + result = REQ_ABORTED; + break; + } } } } else { - net_write(sn->csd, buf, r); + wr = net_write(sn->csd, buf, r); + if(wr <= 0) { + result = REQ_ABORTED; + break; + } } } cgi_parser_free(parser); - return REQ_PROCEED; + return result; } int cgi_start(CGIProcess *p, char *path, char *const argv[], char *const envp[]) {