LGTM

On Tue, 30 Apr 2019, 10:12 Alexander Graf, <ag...@csgraf.de> wrote:

> When creating T32->A32 transition jumps, the relocation code in grub
> will generate trampolines. These trampolines live in the .data section
> of our PE binary which means they are not marked as executable.
>
> This misbehavior was unmasked by commit a51f953f4ee87 ("mkimage: Align
> efi sections on 4k boundary") which made the X/NX boundary more obvious
> because everything became page aligned.
>
> To put things into proper order, let's move the arm trampolines into the
> .text section instead. That way everyone knows they are executable.
>
> Fixes: a51f953f4ee87 ("mkimage: Align efi sections on 4k boundary")
> Reported-by: Julien ROBIN <julien.robi...@free.fr>
> Reported-by: Leif Lindholm <leif.lindh...@linaro.org>
>
> Signed-off-by: Alexander Graf <ag...@csgraf.de>
> ---
>  util/grub-mkimagexx.c | 29 +++++++++++++----------------
>  1 file changed, 13 insertions(+), 16 deletions(-)
>
> diff --git a/util/grub-mkimagexx.c b/util/grub-mkimagexx.c
> index 2059890c3..af23fae52 100644
> --- a/util/grub-mkimagexx.c
> +++ b/util/grub-mkimagexx.c
> @@ -2197,25 +2197,10 @@ SUFFIX (locate_sections) (Elf_Ehdr *e, const char
> *kernel_path,
>           }
>        }
>
> -  layout->kernel_size = ALIGN_UP (layout->kernel_size +
> image_target->vaddr_offset,
> -                             image_target->section_align)
> -    - image_target->vaddr_offset;
> -  layout->exec_size = layout->kernel_size;
> -
> -  /* .data */
> -  for (i = 0, s = smd->sections;
> -       i < smd->num_sections;
> -       i++, s = (Elf_Shdr *) ((char *) s + smd->section_entsize))
> -    if (SUFFIX (is_data_section) (s, image_target))
> -      layout->kernel_size = SUFFIX (put_section) (s, i,
> layout->kernel_size, smd,
> -                                                 image_target);
> -
>  #ifdef MKIMAGE_ELF32
>    if (image_target->elf_target == EM_ARM)
>      {
>        grub_size_t tramp;
> -      layout->kernel_size = ALIGN_UP (layout->kernel_size +
> image_target->vaddr_offset,
> -                                     image_target->section_align) -
> image_target->vaddr_offset;
>
>        layout->kernel_size = ALIGN_UP (layout->kernel_size, 16);
>
> @@ -2223,10 +2208,22 @@ SUFFIX (locate_sections) (Elf_Ehdr *e, const char
> *kernel_path,
>                                        smd->num_sections, image_target);
>
>        layout->tramp_off = layout->kernel_size;
> -      layout->kernel_size += ALIGN_UP (tramp, 16);
>      }
>  #endif
>
> +  layout->kernel_size = ALIGN_UP (layout->kernel_size +
> image_target->vaddr_offset,
> +                             image_target->section_align)
> +    - image_target->vaddr_offset;
> +  layout->exec_size = layout->kernel_size;
> +
> +  /* .data */
> +  for (i = 0, s = smd->sections;
> +       i < smd->num_sections;
> +       i++, s = (Elf_Shdr *) ((char *) s + smd->section_entsize))
> +    if (SUFFIX (is_data_section) (s, image_target))
> +      layout->kernel_size = SUFFIX (put_section) (s, i,
> layout->kernel_size, smd,
> +                                                 image_target);
> +
>    layout->bss_start = layout->kernel_size;
>    layout->end = layout->kernel_size;
>
> --
> 2.16.4
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel
>
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to