From 38a15bee85f3ff776cb72ff20e197ff75e0dcdcd Mon Sep 17 00:00:00 2001 From: Nelson Ferreira Date: Tue, 6 Mar 2012 02:10:19 -0500 Subject: [PATCH] Coverity: Resource leak: CID 400015 * src/callproc.c (relocate_fd): Make sure that dup'ed file descriptors < min are closed. In addition, make a better version when dup2 is available. Signed-off-by: Nelson Ferreira --- src/callproc.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/callproc.c b/src/callproc.c index 9d71d65..41f9c12 100644 --- a/src/callproc.c +++ b/src/callproc.c @@ -477,6 +477,20 @@ quit again. The original file descriptor remains open. */ static int relocate_fd(int fd, int min) { +#ifdef HAVE_DUP2 + for( ; min >= 0 && lseek(min, SEEK_CUR,0) >= 0; min++ ) { + if (errno == EBADF) { + int newfd = dup2(fd,min); + if (newfd == -1) { + stderr_out("Error while setting up child: %s\n", + strerror(errno)); + _exit(1); + } + assert(newfd == min); + return newfd; + } + } +#else if (fd >= min) return fd; else { @@ -485,9 +499,15 @@ static int relocate_fd(int fd, int min) stderr_out("Error while setting up child: %s\n", strerror(errno)); _exit(1); + } else if (newfd >= min ) { + return newfd; + } else { + int recurse_fd = relocate_fd(newfd, min); + close(newfd); + return recurse_fd; } - return relocate_fd(newfd, min); } +#endif } /* This is the last thing run in a newly forked inferior -- 2.25.1