Commit 7de7de7c authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Fix root mounting with no mount options



The "trivial conversion" in commit cccaa5e3 ("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 bug was hidden by me having options.

Cc: Dominik Brodowski <linux@dominikbrodowski.net>
Cc: Arnd Bergmann <arnd@arndb.de>
Reported-by: default avatarOndřej Jirman <megi@xff.cz>
Reported-by: default avatarGuenter Roeck <linux@roeck-us.net>
Reported-by: default avatarNaresh Kamboju <naresh.kamboju@linaro.org>
Reported-and-tested-by: default avatarBorislav Petkov <bp@suse.de>
Tested-by: default avatarChris Clayton <chris2553@googlemail.com>
Tested-by: default avatarEric Biggers <ebiggers@kernel.org>
Tested-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
Tested-by: default avatarGuido Günther <agx@sigxcpu.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent d1eef1c6
Loading
Loading
Loading
Loading
+13 −10
Original line number Diff line number Diff line
@@ -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;

	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);
		/* zero-pad. do_mount() will make sure it's terminated */
		strncpy(data_page, data, PAGE_SIZE);
	}

	ret = do_mount(name, "/root", fs, flags, data_page);
	if (ret)
@@ -417,6 +419,7 @@ static int __init do_mount_root(const char *name, const char *fs,
	       MAJOR(ROOT_DEV), MINOR(ROOT_DEV));

out:
	if (p)
		put_page(p);
	return ret;
}