Messages in this thread Patch in this message |  | | From | Linus Torvalds <> | Date | Sun, 15 Dec 2019 19:50:23 -0800 | Subject | Re: [PATCH 3/3] init: use do_mount() instead of ksys_mount() |
| |
On Sun, Dec 15, 2019 at 5:35 PM Ondřej Jirman <megi@xff.cz> wrote: > > Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
Duh. So much for the trivial obvious conversion.
It didn't take "data might be NULL" into account.
A patch like this, perhaps? Untested..
Linus init/do_mounts.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-)
diff --git a/init/do_mounts.c b/init/do_mounts.c index f55cbd9cb818..d204f605dbce 100644 --- a/init/do_mounts.c +++ b/init/do_mounts.c @@ -391,17 +391,19 @@ static int __init do_mount_root(const char *name, const char *fs, const int flags, const void *data) { struct super_block *s; - char *data_page; - struct page *p; + struct page *p = NULL; + char *data_page = NULL; int ret; - /* do_mount() requires a full page as fifth argument */ - p = alloc_page(GFP_KERNEL); - if (!p) - return -ENOMEM; - - data_page = page_address(p); - strncpy(data_page, data, PAGE_SIZE - 1); + 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); + strncpy(data_page, data, PAGE_SIZE - 1); + data_page[PAGE_SIZE - 1] = '\0'; + } ret = do_mount(name, "/root", fs, flags, data_page); if (ret) @@ -417,7 +419,8 @@ static int __init do_mount_root(const char *name, const char *fs, MAJOR(ROOT_DEV), MINOR(ROOT_DEV)); out: - put_page(p); + if (p) + put_page(p); return ret; } |  |