Busybox is very often used in initramfs at the end of which usually there is a switch_root to the actual rootfs. There are many cases where the console kernel argument is either just a placeholder (for example RaspberryPi uses serial0 and serial1) or configured as null to avoid any console messages - usually you would see such of a setup in production environments.
Currently busybox bails out if can't open the console argument. If this happenes in initramfs and if the console=null for example, you get in a blind kernel panic. Avoid this by checking if the console exists and if not warn and continue. Signed-off-by: Andrei Gherzan <[email protected]> --- util-linux/switch_root.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/util-linux/switch_root.c b/util-linux/switch_root.c index 6034485d7..a39ec0ba7 100644 --- a/util-linux/switch_root.c +++ b/util-linux/switch_root.c @@ -39,6 +39,7 @@ #include <sys/vfs.h> #include <sys/mount.h> +#include <unistd.h> #include "libbb.h" // Make up for header deficiencies #ifndef RAMFS_MAGIC @@ -140,12 +141,14 @@ int switch_root_main(int argc UNUSED_PARAM, char **argv) /*xchdir("/"); - done in xchroot */ // If a new console specified, redirect stdin/stdout/stderr to it - if (console) { - close(0); - xopen(console, O_RDWR); - xdup2(0, 1); - xdup2(0, 2); - } + if (console) + if (access(console, F_OK)) { + close(0); + xopen(console, O_RDWR); + xdup2(0, 1); + xdup2(0, 2); + } else + bb_error_msg("specified console doesn't exist, ignoring"); // Exec real init execv(argv[0], argv); -- 2.12.0 _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
