# HG changeset patch
# User Olaf Wintermann <olaf.wintermann@gmail.com>
# Date 1737199310 -3600
# Node ID fed45fc71e7cb11473a010bf22e3cc0a04964439
# Parent  963edce64e6e7372d2997462d70e2cb9ed8cfb29
check and close pipes if cgi_start fails

diff -r 963edce64e6e -r fed45fc71e7c src/server/safs/cgi.c
--- 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;