From 9086b192fb4eaa10bae1bc1a19b8a4559c7f65fa Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Mon, 8 Jul 2019 17:08:22 -0400 Subject: spawn: Actually fix moving the pipe out of the way We have to check in_fd after out_fd, otherwise the dup() may move it to in_fd. --- spawn.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'spawn.c') diff --git a/spawn.c b/spawn.c index bcd2c08..b356c41 100644 --- a/spawn.c +++ b/spawn.c @@ -147,13 +147,7 @@ static void bfs_spawn_exec(const char *exe, const struct bfs_spawn *ctx, char ** close(pipefd[0]); for (const struct bfs_spawn_action *action = actions; action; action = action->next) { - // Pretend the error-reporting pipe doesn't exist - if (action->in_fd == pipefd[1]) { - errno = EBADF; - goto fail; - } - - // Move the pipe out of the way if necessary + // Move the error-reporting pipe out of the way if necessary... if (action->out_fd == pipefd[1]) { int fd = dup_cloexec(pipefd[1]); if (fd < 0) { @@ -163,6 +157,12 @@ static void bfs_spawn_exec(const char *exe, const struct bfs_spawn *ctx, char ** pipefd[1] = fd; } + // ... and pretend the pipe doesn't exist + if (action->in_fd == pipefd[1]) { + errno = EBADF; + goto fail; + } + switch (action->op) { case BFS_SPAWN_CLOSE: if (close(action->out_fd) != 0) { -- cgit v1.2.3