From: Andrew Morton <akpm@linux-foundation.org>
To: P J P <ppandit@redhat.com>
Cc: linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/2] Fix NULL pointer dereference while loading initramfs
Date: Mon, 23 Sep 2013 12:41:10 -0700 [thread overview]
Message-ID: <20130923124110.9b8aebd78c2b602255f1dc1f@linux-foundation.org> (raw)
In-Reply-To: <alpine.LFD.2.03.1309151431180.7830@erqung.pbz>
On Sun, 15 Sep 2013 14:33:53 +0530 (IST) P J P <ppandit@redhat.com> wrote:
> Make menuconfig allows one to choose compression format of an
> initial ramdisk image. But this choice does not result in duly
> compressed initial ramdisk image. Because - $ make install - does
> not pass on the selected compression choice to the dracut(8) tool,
> which creates the initramfs file. dracut(8) generates the image
> with the default compression, ie. gzip(1).
>
> If a user chose any other compression instead of gzip(1), it leads
> to a crash due to NULL pointer dereference in crd_load(), caused by
> a NULL function pointer returned by the 'decompress_method()' routine.
> Because the initramfs image is gzip(1) compressed, whereas the kernel
> knows how decompress the chosen format and not gzip(1).
>
> This patch replaces the crash by an explicit panic() call with an
> appropriate error message. This shall prevent the kernel from
> eventually panicking in: init/do_mounts.c: mount_block_root() with
> -> panic("VFS: Unable to mount root fs on %s", b);
>
> Signed-off-by: P J P <prasad@redhat.com>
>
> diff --git a/init/do_mounts_rd.c b/init/do_mounts_rd.c
> index 6be2879..76faec1 100644
> --- a/init/do_mounts_rd.c
> +++ b/init/do_mounts_rd.c
> @@ -342,6 +342,13 @@ static int __init crd_load(int in_fd, int out_fd, decompress_fn deco)
> int result;
> crd_infd = in_fd;
> crd_outfd = out_fd;
> +
> + if (!deco)
> + {
> + printk(KERN_EMERG "Invalid decompression routine address: %p\n", deco);
> + panic("Could not decompress initial ramdisk image.");
> + }
A few things here.
- the coding style is very unconventional. We'd do it like this:
static int __init crd_load(int in_fd, int out_fd, decompress_fn deco)
{
int result;
crd_infd = in_fd;
crd_outfd = out_fd;
if (!deco) {
pr_emerg("Invalid decompression routine address: %p\n", deco);
panic("Could not decompress initial ramdisk image.");
}
result = deco(NULL, 0, compr_fill, compr_flush, NULL, NULL, error);
if (decompress_error)
result = 1;
return result;
}
- Note the use of the pr_emerg() shorthand, which prevents the
statement from overflowing 80 columns.
- There isn't much point in printing the value of `deco' - we already
know it's NULL. Isn't there some more useful message we can display
which will tell the user what he/she did wrong, and which explains
how to fix it?
- Is anyone working on fixing up Kconfig/dracut(8) so the correct
decompression method is used?
next prev parent reply other threads:[~2013-09-23 19:41 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-15 9:03 [PATCH 1/2] Fix NULL pointer dereference while loading initramfs P J P
2013-09-23 19:41 ` Andrew Morton [this message]
2013-09-24 1:38 ` Rob Landley
2013-09-24 19:01 ` P J P
2013-09-24 18:45 ` P J P
2013-09-30 21:43 ` P J P
2013-10-05 20:42 ` P J P
2013-10-05 21:28 ` Andrew Morton
2013-10-06 8:09 ` P J P
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20130923124110.9b8aebd78c2b602255f1dc1f@linux-foundation.org \
--to=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=ppandit@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox