aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco d'Itri <md@Linux.IT>2006-08-27 02:53:16 +0200
committerKay Sievers <kay.sievers@suse.de>2006-08-27 02:53:16 +0200
commitb83b299141ccbe2b60cf49a766a540c43f32167c (patch)
tree2a61f06e66fb86fed3e1eaf78a1fc5b6cc3eb6bc
parenta1e6bd93d3d650c2064daafdb253120ae6e89398 (diff)
downloadudev-b83b299141ccbe2b60cf49a766a540c43f32167c.tar.gz
run_program: close pipe fd's which are connected to child process
When udev_log="debug", the children of udev inherit the file descriptors of the pipes used to capture output. If they are not properly closed then udev will not exit until all programs started in the background by the children are terminated or have closed the fds themselves, and this may cause deadlocks with udevsettle.
-rw-r--r--udev_utils_run.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/udev_utils_run.c b/udev_utils_run.c
index 76a704c5..2771861c 100644
--- a/udev_utils_run.c
+++ b/udev_utils_run.c
@@ -151,10 +151,14 @@ int run_program(const char *command, const char *subsystem,
close(devnull);
} else
err("open /dev/null failed: %s", strerror(errno));
- if (outpipe[WRITE_END] > 0)
+ if (outpipe[WRITE_END] > 0) {
dup2(outpipe[WRITE_END], STDOUT_FILENO);
- if (errpipe[WRITE_END] > 0)
+ close(outpipe[WRITE_END]);
+ }
+ if (errpipe[WRITE_END] > 0) {
dup2(errpipe[WRITE_END], STDERR_FILENO);
+ close(errpipe[WRITE_END]);
+ }
execv(argv[0], argv);
/* we should never reach this */