grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] loader/i386/linux: calculate the size of the setup header


From: Daniel Kiper
Subject: Re: [PATCH] loader/i386/linux: calculate the size of the setup header
Date: Wed, 30 May 2018 16:40:54 +0200
User-agent: Mutt/1.3.28i

On Fri, May 25, 2018 at 12:02:03PM -0700, Andrew Jeddeloh wrote:
> Oops, my bad, didn't mean to drop the ML.

No problem. Sometimes it happens.

> So you're saying the setup header could expand to include some of pad7
> in the future, but we error if it goes beyond that (into the e820

Yep!

> map)? Looking at bootparam.h it looks like the _most_ correct thing
> would be to stop at edd_mbr_sig_buffer, but grub doesn't have a

Exactly!

> corresponding field so e820_map seems good enough. Thanks for working

I would suggest to add edd_mbr_sig_buffer[] to linux_kernel_params.
It does not cost a lot.

> through this.
>
> Here's the revised patch

Next time please post the patch in separate email.

> >From d46c75b4a9151c10e7f7809637f9f42a2c393c25 Mon Sep 17 00:00:00 2001
> From: Andrew Jeddeloh <address@hidden>
> Date: Tue, 8 May 2018 14:39:01 -0700
> Subject: [PATCH] loader/i386/linux: calculate setup header length
>
> Previously the length was just assumed to be the size of the
> linux_params struct. The linux x86 32 bit boot protocol says the size of
> the setup header is 0x202 + the byte at 0x201 in the boot params.
> Calculate the size of the header, rather than assume it is the size of
> the linux_params struct.
>
> Signed-off-by: Andrew Jeddeloh <address@hidden>
> ---
>  grub-core/loader/i386/linux.c | 14 +++++++++++++-
>  1 file changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/grub-core/loader/i386/linux.c b/grub-core/loader/i386/linux.c
> index 44301e126..b5b65ea36 100644
> --- a/grub-core/loader/i386/linux.c
> +++ b/grub-core/loader/i386/linux.c
> @@ -805,7 +805,19 @@ grub_cmd_linux (grub_command_t cmd __attribute__
> ((unused)),
>    linux_params.kernel_alignment = (1 << align);
>    linux_params.ps_mouse = linux_params.padding10 =  0;
>
> -  len = sizeof (linux_params) - sizeof (lh);
> +  /* The Linux 32 bit boot protocol defines the setup header size to
> be 0x202 + the byte value
> +   * at 0x201. */
> +  len = *((char *)&linux_params.jump + 1) + 0x202;

Let's be in line with the comment:
  len = 0x202 + *((char *) &linux_params.jump + 1);

> +  /* Verify the struct is big enough so we do not write past the end */
> +  if (len > (char *)&linux_params.e820_map - (char *)&linux_params) {

Lack of space between "(char *)" and "&".

> +    grub_error (GRUB_ERR_BAD_OS, "boot params setup header too big");
> +    goto fail;
> +  }
> +
> +  /* We've already read lh so there is no need to read it second time. */
> +  len -= sizeof(lh);
> +
>    if (grub_file_read (file, (char *) &linux_params + sizeof (lh), len) != 
> len)
>      {
>        if (!grub_errno)

Otherwise, +/- edd_mbr_sig_buffer[], the patch LGTM.

Daniel



reply via email to

[Prev in Thread] Current Thread [Next in Thread]