From: Edgar Toernig Date: Thu, 13 Jul 2006 13:27:25 GMT Subject: Re: [PATCH 2/5] daemon: if one of the standard fds is missing open it to /dev/null Message-ID: <20060713152725.7a5081df.froese@gmx.de> In-Reply-To: Matthias Lederhofer wrote: > > +/* 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.