init: do not use bb_sanitize_stdio(), "/dev/null" may be missing (yet)
authorDenis Vlasenko <vda.linux@googlemail.com>
Mon, 17 Mar 2008 13:26:51 +0000 (13:26 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Mon, 17 Mar 2008 13:26:51 +0000 (13:26 -0000)
init/init.c

index 6d4969c4be6de772dac6254aced1a9fafd3ba174..eefb9df55a238646330fee874a13423fe0571042 100644 (file)
@@ -219,8 +219,22 @@ static void console_init(void)
                }
                messageD(L_LOG, "console='%s'", s);
        } else {
-               /* Make sure fd 0,1,2 are not closed */
-               bb_sanitize_stdio();
+               /* Make sure fd 0,1,2 are not closed
+                * (so that they won't be used by future opens) */
+
+               /* bb_sanitize_stdio(); - WRONG.
+                * Fail if "/dev/null" doesnt exist, and for init
+                * this is a real possibility! Open code it instead. */
+
+               int fd = open(bb_dev_null, O_RDWR);
+               if (fd < 0) {
+                       /* Give me _ANY_ open descriptor! */
+                       fd = xopen("/", O_RDONLY); /* we don't believe this can fail */
+               }
+               while ((unsigned)fd < 2)
+                       fd = dup(fd);
+               if (fd > 2)
+                       close (fd);
        }
 
        s = getenv("TERM");