[ovs-dev] [coverity3 02/13] process: Avoid late failure if /dev/null cannot be opened.
Ethan Jackson
ethan at nicira.com
Wed Feb 23 21:39:27 UTC 2011
Looks Good.
On Wed, Feb 23, 2011 at 1:24 PM, Ben Pfaff <blp at nicira.com> wrote:
> 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 files changed, 18 insertions(+), 6 deletions(-)
>
> diff --git a/lib/process.c b/lib/process.c
> index 6e9ea8e..8263437 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));
> --
> 1.7.2.3
>
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev_openvswitch.org
>
More information about the dev
mailing list