check and close pipes if cgi_start fails

2 months ago

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 18 Jan 2025 12:21:50 +0100 (2 months ago)
changeset 567
fed45fc71e7c
parent 566
963edce64e6e
child 568
3f8c587734aa

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;

mercurial