From 67ac2d68628e4c2924bcecdca049172db25048e8 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Sun, 15 Dec 2019 19:50:23 -0800 Subject: [PATCH] Fix root mounting with no mount options MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The "trivial conversion" in commit cccaa5e33525 ("init: use do_mount() instead of ksys_mount()") was totally broken, since it didn't handle the case of a NULL mount data pointer and while I had "tested" it (and presumably Dominik had too) that was hidden by me having options. Change-Id: I2b1db7b68e0e398ce803da40b37595c286c97d9c Cc: Dominik Brodowski Cc: Arnd Bergmann Reported-by: Ondřej Jirman Reported-by: Guenter Roeck Reported-by: Naresh Kamboju Reported-and-tested-by: Borislav Petkov Tested-by: Chris Clayton Tested-by: Eric Biggers Tested-by: Geert Uytterhoeven Tested-by: Guido Günther Signed-off-by: Linus Torvalds Git-commit: 7de7de7ca0ae0fc70515ee3154af33af75edae2c Git-repo: https://github.com/torvalds/linux.git [pragalla@codeaurora.org:fix merge conflicts and port changes to 5.4 kernel] Signed-off-by: Pradeep P V K --- init/do_mounts.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/init/do_mounts.c b/init/do_mounts.c index 871dbc3e9cb5..fa364cf4c131 100644 --- a/init/do_mounts.c +++ b/init/do_mounts.c @@ -386,17 +386,20 @@ static void __init get_fs_names(char *page) static int __init do_mount_root(char *name, char *fs, int flags, void *data) { struct super_block *s; - char *data_page; - struct page *p; + char *data_page = NULL; + struct page *p = NULL; int ret; - /* do_mount() requires a full page as fifth argument */ - p = alloc_page(GFP_KERNEL); - if (!p) - return -ENOMEM; + if (data) { + /* do_mount() requires a full page as fifth argument */ + p = alloc_page(GFP_KERNEL); + if (!p) + return -ENOMEM; - data_page = page_address(p); - strscpy(data_page, data, PAGE_SIZE - 1); + data_page = page_address(p); + /* zero-pad. do_mount() will make sure it's terminated */ + strscpy(data_page, data, PAGE_SIZE); + } ret = ksys_mount(name, "/root", fs, flags, data_page); if (ret) @@ -412,7 +415,8 @@ static int __init do_mount_root(char *name, char *fs, int flags, void *data) MAJOR(ROOT_DEV), MINOR(ROOT_DEV)); out: - put_page(p); + if (p) + put_page(p); return ret; }