Messages in this thread |  | | Date | Mon, 16 Dec 2019 16:53:32 +0100 | From | Guido Günther <> | Subject | Re: [PATCH 3/3] init: use do_mount() instead of ksys_mount() |
| |
Hi, On Sun, Dec 15, 2019 at 07:50:23PM -0800, Linus Torvalds wrote: > 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; n> 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; > } >
This unbroke tftpboot on arm64 on next-20191216 for me as well:
Tested-by: Guido Günther <agx@sigxcpu.org>
Cheers, -- Guido
|  |