Re: [PATCH 2/5] daemon: if one of the standard fds is missing open it to /dev/null
- From
- Edgar Toernig <froese@gmx.de>
- Date
- Jul 13, 2006, 13:27 UTC
- Message-ID
- <20060713152725.7a5081df.froese@gmx.de>
- In-Reply-To
- <E1G0znB-0002IO-61@moooo.ath.cx>
Matthias Lederhofer wrote:
Show 18 quoted lines
>
> +/* if any standard file descriptor is missing open it to /dev/null */
> +static void sanitize_stdfds(void)
> +{
> + int devnull = -1, i;
> + struct stat buf;
> + for (i = 0; i < 3; ++i) {
> + if (fstat(i, &buf) != -1)
> + continue;
> + if (devnull == -1 &&
> + (devnull = open("/dev/null", O_RDWR, 0)) == -1)
> + die("open /dev/null failed: %s", strerror(errno));
> + if (dup2(devnull, i) != i)
> + die("dup2 failed: %s", strerror(errno));
> + }
> + if (devnull != -1)
> + close(devnull);
> +}This looks broken. The open will return i as this is the lowest free fd. I don't know what POSIX says about dup2(i,i) but anyway, you close it at the end which completely defeats the intent of the function.
How's this?
devnull = open("/dev/null", O_RDWR, 0);
if (devnull == 0)
devnull = dup(devnull);
if (devnull == 1)
devnull = dup(devnull);
if (devnull == -1)
die("open/dup /dev/null failed: %s", strerror(errno));
if (devnull > 2)
close(devnull);Ciao, ET.