chiark / gitweb /
run_program: close pipe fd's which are connected to child process
authorMarco d'Itri <md@Linux.IT>
Sun, 27 Aug 2006 00:53:16 +0000 (02:53 +0200)
committerKay Sievers <kay.sievers@suse.de>
Sun, 27 Aug 2006 00:53:16 +0000 (02:53 +0200)
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.

udev_utils_run.c

index 76a704c52cb19b93db15fe517f2b3171043708b8..2771861cf55ad4bd9e4a72bac404f7909c89c9ed 100644 (file)
@@ -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 */