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.