From: Jo-Philipp Wich Date: Wed, 18 Dec 2019 08:32:38 +0000 (+0100) Subject: cgi-io: close pipe descriptors early X-Git-Url: http://git.openwrt.org/project/luci.git;master?a=commitdiff_plain;ds=sidebyside;h=988c9ae3568c3d9e7b720bd448880ce030c3cc48;p=project%2Fcgi-io.git cgi-io: close pipe descriptors early 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 --- diff --git a/Makefile b/Makefile index 5107cd6..27bdf73 100644 --- 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 diff --git a/src/main.c b/src/main.c index 778dc4c..7cf8d7b 100644 --- a/src/main.c +++ b/src/main.c @@ -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;