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; }