From fe81a2987abeda195f6535cab973b1c753cca4b3 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Wed, 23 Feb 2011 11:16:07 -0800 Subject: [PATCH] process: Avoid late failure if /dev/null cannot be opened. It is (very slightly) risky to open /dev/null every time that we need it, because open can fail. So this commit opens /dev/null in advance instead. Coverity #10719. --- lib/process.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/lib/process.c b/lib/process.c index 6e9ea8ec..8263437c 100644 --- a/lib/process.c +++ b/lib/process.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010 Nicira Networks. + * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -195,6 +195,7 @@ process_start(char **argv, struct process **pp) { sigset_t oldsigs; + int nullfd; pid_t pid; int error; @@ -205,6 +206,15 @@ process_start(char **argv, return error; } + if (n_null_fds) { + nullfd = get_null_fd(); + if (nullfd < 0) { + return -nullfd; + } + } else { + nullfd = -1; + } + block_sigchld(&oldsigs); pid = fork(); if (pid < 0) { @@ -225,15 +235,17 @@ process_start(char **argv, unblock_sigchld(&oldsigs); for (fd = 0; fd < fd_max; fd++) { if (is_member(fd, null_fds, n_null_fds)) { - /* We can't use get_null_fd() here because we might have - * already closed its fd. */ - int nullfd = open("/dev/null", O_RDWR); dup2(nullfd, fd); - close(nullfd); - } else if (fd >= 3 && !is_member(fd, keep_fds, n_keep_fds)) { + } else if (fd >= 3 && fd != nullfd + && !is_member(fd, keep_fds, n_keep_fds)) { close(fd); } } + if (nullfd >= 0 + && !is_member(nullfd, keep_fds, n_keep_fds) + && !is_member(nullfd, null_fds, n_null_fds)) { + close(nullfd); + } execvp(argv[0], argv); fprintf(stderr, "execvp(\"%s\") failed: %s\n", argv[0], strerror(errno)); -- 2.30.2