util: add new safe_close_above_stdio() wrapper
At various places we only want to close fds if they are not stdin/stdout/stderr, i.e. fds 0, 1, 2. Let's add a unified helper call for that, and port everything over.
This commit is contained in:
parent
c7f9a8d270
commit
e7685a77b4
|
@ -0,0 +1,36 @@
|
||||||
|
@@
|
||||||
|
expression fd;
|
||||||
|
@@
|
||||||
|
- if (fd > 2)
|
||||||
|
- safe_close(fd);
|
||||||
|
+ safe_close_above_stdio(fd);
|
||||||
|
@@
|
||||||
|
expression fd;
|
||||||
|
@@
|
||||||
|
- if (fd > 2)
|
||||||
|
- fd = safe_close(fd);
|
||||||
|
+ fd = safe_close_above_stdio(fd);
|
||||||
|
@@
|
||||||
|
expression fd;
|
||||||
|
@@
|
||||||
|
- if (fd >= 3)
|
||||||
|
- safe_close(fd);
|
||||||
|
+ safe_close_above_stdio(fd);
|
||||||
|
@@
|
||||||
|
expression fd;
|
||||||
|
@@
|
||||||
|
- if (fd >= 3)
|
||||||
|
- fd = safe_close(fd);
|
||||||
|
+ fd = safe_close_above_stdio(fd);
|
||||||
|
@@
|
||||||
|
expression fd;
|
||||||
|
@@
|
||||||
|
- if (fd > STDERR_FILENO)
|
||||||
|
- safe_close(fd);
|
||||||
|
+ safe_close_above_stdio(fd);
|
||||||
|
@@
|
||||||
|
expression fd;
|
||||||
|
@@
|
||||||
|
- if (fd > STDERR_FILENO)
|
||||||
|
- fd = safe_close(fd);
|
||||||
|
+ fd = safe_close_above_stdio(fd);
|
|
@ -35,6 +35,13 @@ int close_nointr(int fd);
|
||||||
int safe_close(int fd);
|
int safe_close(int fd);
|
||||||
void safe_close_pair(int p[]);
|
void safe_close_pair(int p[]);
|
||||||
|
|
||||||
|
static inline int safe_close_above_stdio(int fd) {
|
||||||
|
if (fd < 3) /* Don't close stdin/stdout/stderr, but still invalidate the fd by returning -1 */
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return safe_close(fd);
|
||||||
|
}
|
||||||
|
|
||||||
void close_many(const int fds[], unsigned n_fd);
|
void close_many(const int fds[], unsigned n_fd);
|
||||||
|
|
||||||
int fclose_nointr(FILE *f);
|
int fclose_nointr(FILE *f);
|
||||||
|
|
|
@ -94,14 +94,7 @@ static char *log_abort_msg = NULL;
|
||||||
} while (false)
|
} while (false)
|
||||||
|
|
||||||
static void log_close_console(void) {
|
static void log_close_console(void) {
|
||||||
|
console_fd = safe_close_above_stdio(console_fd);
|
||||||
if (console_fd < 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (console_fd >= 3)
|
|
||||||
safe_close(console_fd);
|
|
||||||
|
|
||||||
console_fd = -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int log_open_console(void) {
|
static int log_open_console(void) {
|
||||||
|
|
|
@ -1428,8 +1428,7 @@ int fork_agent(const char *name, const int except[], unsigned n_except, pid_t *r
|
||||||
_exit(EXIT_FAILURE);
|
_exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fd > STDERR_FILENO)
|
safe_close_above_stdio(fd);
|
||||||
close(fd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Count arguments */
|
/* Count arguments */
|
||||||
|
|
|
@ -917,8 +917,7 @@ int make_stdio(int fd) {
|
||||||
if (dup2(fd, STDERR_FILENO) < 0 && r >= 0)
|
if (dup2(fd, STDERR_FILENO) < 0 && r >= 0)
|
||||||
r = -errno;
|
r = -errno;
|
||||||
|
|
||||||
if (fd >= 3)
|
safe_close_above_stdio(fd);
|
||||||
safe_close(fd);
|
|
||||||
|
|
||||||
/* Explicitly unset O_CLOEXEC, since if fd was < 3, then dup2() was a NOP and the bit hence possibly set. */
|
/* Explicitly unset O_CLOEXEC, since if fd was < 3, then dup2() was a NOP and the bit hence possibly set. */
|
||||||
stdio_unset_cloexec();
|
stdio_unset_cloexec();
|
||||||
|
|
|
@ -141,9 +141,7 @@ int main(int argc, char *argv[]) {
|
||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fd >= 3)
|
fd = safe_close_above_stdio(fd);
|
||||||
safe_close(fd);
|
|
||||||
fd = -1;
|
|
||||||
|
|
||||||
if (argc <= optind)
|
if (argc <= optind)
|
||||||
(void) execl("/bin/cat", "/bin/cat", NULL);
|
(void) execl("/bin/cat", "/bin/cat", NULL);
|
||||||
|
|
|
@ -57,10 +57,8 @@ static int spawn_getent(const char *database, const char *key, pid_t *rpid) {
|
||||||
if (dup3(pipe_fds[1], STDOUT_FILENO, 0) < 0)
|
if (dup3(pipe_fds[1], STDOUT_FILENO, 0) < 0)
|
||||||
_exit(EXIT_FAILURE);
|
_exit(EXIT_FAILURE);
|
||||||
|
|
||||||
if (pipe_fds[0] > 2)
|
safe_close_above_stdio(pipe_fds[0]);
|
||||||
safe_close(pipe_fds[0]);
|
safe_close_above_stdio(pipe_fds[1]);
|
||||||
if (pipe_fds[1] > 2)
|
|
||||||
safe_close(pipe_fds[1]);
|
|
||||||
|
|
||||||
nullfd = open("/dev/null", O_RDWR);
|
nullfd = open("/dev/null", O_RDWR);
|
||||||
if (nullfd < 0)
|
if (nullfd < 0)
|
||||||
|
@ -72,8 +70,7 @@ static int spawn_getent(const char *database, const char *key, pid_t *rpid) {
|
||||||
if (dup3(nullfd, STDERR_FILENO, 0) < 0)
|
if (dup3(nullfd, STDERR_FILENO, 0) < 0)
|
||||||
_exit(EXIT_FAILURE);
|
_exit(EXIT_FAILURE);
|
||||||
|
|
||||||
if (nullfd > 2)
|
safe_close_above_stdio(nullfd);
|
||||||
safe_close(nullfd);
|
|
||||||
|
|
||||||
close_all_fds(NULL, 0);
|
close_all_fds(NULL, 0);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue