cgi-io: close pipe descriptors early
authorJo-Philipp Wich <jo@mein.io>
Wed, 18 Dec 2019 08:32:38 +0000 (09:32 +0100)
committerJohn Crispin <john@phrozen.org>
Wed, 18 Dec 2019 10:00:15 +0000 (11:00 +0100)
In the command read side, close the superfluous write end of the pipe
early to ensure that EOF is reliably detected. Without that change, splice
calls to read from the pipe will occasionally hang until the CGI process
is eventually killed due to timeout.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Makefile
src/main.c

index 5107cd61cccfc47977b09f0937c76c3236d41fc7..27bdf737fe39ff12c69f7dbb5161f4649ae4bf2b 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -8,7 +8,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=cgi-io
-PKG_RELEASE:=15
+PKG_RELEASE:=16
 
 PKG_LICENSE:=GPL-2.0-or-later
 
index 778dc4c63796241b3b8772f9980f0290225c8d93..7cf8d7b23dd097b8c7e74b5f6724f6ac4ad8088b 100644 (file)
@@ -778,6 +778,8 @@ main_backup(int argc, char **argv)
                return -1;
 
        default:
+               close(fds[1]);
+
                now = time(NULL);
                strftime(datestr, sizeof(datestr) - 1, "%Y-%m-%d", localtime(&now));
 
@@ -798,7 +800,6 @@ main_backup(int argc, char **argv)
                waitpid(pid, &status, 0);
 
                close(fds[0]);
-               close(fds[1]);
 
                return 0;
        }
@@ -1010,6 +1011,8 @@ main_exec(int argc, char **argv)
                return -1;
 
        default:
+               close(fds[1]);
+
                printf("Status: 200 OK\r\n");
                printf("Content-Type: %s\r\n",
                       fields[7] ? fields[7] : "application/octet-stream");
@@ -1028,7 +1031,6 @@ main_exec(int argc, char **argv)
                waitpid(pid, &status, 0);
 
                close(fds[0]);
-               close(fds[1]);
                free(args);
 
                return 0;