summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CONTRIBUTORS1
-rw-r--r--HISTORY2
-rw-r--r--thread.c9
3 files changed, 9 insertions, 3 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index 8d4b3030..038dc88d 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -143,6 +143,7 @@ Artur Skawina <skawina@geocities.com>
Werner Fink <werner@suse.de>
for making I/O more robust by handling EINTR
+ for fixing closing all unused file descriptors when opening a pipe
Rolf Hakenes <hakenes@hippomi.de>
for providing 'libdtv' and adapting the EIT mechanisms to it
diff --git a/HISTORY b/HISTORY
index 50f3ad98..7c9b0e27 100644
--- a/HISTORY
+++ b/HISTORY
@@ -1012,3 +1012,5 @@ Video Disk Recorder Revision History
- When deleting a recording that is currently still being recorded, the related
timer will now automatically be terminated. If this is a repeating timer, it
will receive a "First day" setting that skips the timer for this day.
+- Fixed closing all unused file descriptors when opening a pipe (thanks to
+ Werner Fink).
diff --git a/thread.c b/thread.c
index 7e5b0ea7..4d7fccaf 100644
--- a/thread.c
+++ b/thread.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: thread.c 1.16 2001/10/27 13:23:06 kls Exp $
+ * $Id: thread.c 1.17 2002/02/17 14:47:28 kls Exp $
*/
#include "thread.h"
@@ -277,8 +277,11 @@ bool cPipe::Open(const char *Command, const char *Mode)
_exit(-1);
}
else {
- for (int i = STDERR_FILENO + 1; i < fd[1 - iopipe]; i++)
- close(i); //close all dup'ed filedescriptors
+ for (int i = 0; i <= fd[1]; i++) {
+ if (i == STDIN_FILENO || i == STDOUT_FILENO || i == STDERR_FILENO)
+ continue;
+ close(i); // close all dup'ed filedescriptors
+ }
if (execl("/bin/sh", "sh", "-c", Command, NULL) == -1) {
LOG_ERROR_STR(Command);
close(fd[1 - iopipe]);