2 months ago
check and close pipes if cgi_start fails
src/server/safs/cgi.c | file | annotate | diff | comparison | revisions |
--- a/src/server/safs/cgi.c Sat Jan 18 12:13:08 2025 +0100 +++ b/src/server/safs/cgi.c Sat Jan 18 12:21:50 2025 +0100 @@ -52,6 +52,14 @@ #define CGI_RESPONSE_PARSER_BUFLEN 2048 #define CGI_RESPONSE_MAX_LINE_LENGTH 512 +static void close_std_pipes(int fds[static 6]) { + for(int i=0;i<6;i++) { + if(fds[i] >= 0) { + close(fds[i]); + } + } +} + int send_cgi(pblock *pb, Session *sn, Request *rq) { char *path = pblock_findkeyval(pb_key_path, rq->vars); char *ctlen = pblock_findkeyval(pb_key_content_length, rq->headers); @@ -104,10 +112,20 @@ return REQ_ABORTED; } ZERO(handler, sizeof(CGIHandler)); + handler->process.out[0] = -1; + handler->process.out[1] = -1; + handler->process.err[0] = -1; + handler->process.err[0] = -1; + handler->process.in[0] = -1; + handler->process.in[0] = -1; handler->path = path; int ret = cgi_start(rq, &handler->process, path, argv, env); if(ret != REQ_PROCEED) { + close_std_pipes((int[6]){ + handler->process.out[0], handler->process.out[1], + handler->process.err[0], handler->process.err[1], + handler->process.in[0], handler->process.in[1]}); util_env_free(env); cgi_free_argv(argv); return ret;