From 1a68796bb22c7bd7e21c6105353c46d9ae97d97d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Sat, 13 Mar 1999 22:04:05 +0100
Subject: [PATCH] Fixed fd-leak in create_process().

Rev: src/signal_handler.c:1.118
---
 src/signal_handler.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/src/signal_handler.c b/src/signal_handler.c
index f552f71d17..59fffddf13 100644
--- a/src/signal_handler.c
+++ b/src/signal_handler.c
@@ -23,7 +23,7 @@
 #include "builtin_functions.h"
 #include <signal.h>
 
-RCSID("$Id: signal_handler.c,v 1.117 1999/03/11 03:14:34 hubbe Exp $");
+RCSID("$Id: signal_handler.c,v 1.118 1999/03/13 21:04:05 grubba Exp $");
 
 #ifdef HAVE_PASSWD_H
 # include <passwd.h>
@@ -1206,6 +1206,7 @@ extern int pike_make_pipe(int *);
         ; \
       if (_l < 0) break; \
     } \
+    close(control_pipe[1]); \
     exit(99); \
   } while(0)
 
@@ -2143,8 +2144,13 @@ void f_create_process(INT32 args)
       buf[0] = 0;
       while (((e = write(control_pipe[0], buf, 1)) < 0) && (errno == EINTR))
 	;
-      if(e!=1)
-	error("Child process died prematurely. (e=%d errno=%d)\n",e,errno);
+      if(e!=1) {
+	/* Paranoia in case close() sets errno. */
+	int olderrno = errno;
+	close(control_pipe[0]);
+	error("Child process died prematurely. (e=%d errno=%d)\n",
+	      e ,olderrno);
+      }
 
       /* Wait for exec or error */
       while (((e = read(control_pipe[0], buf, 3)) < 0) && (errno == EINTR))
-- 
GitLab