From 750c71975e4bee0d4be635862f936e6307929e2c Mon Sep 17 00:00:00 2001 From: Luca Bruno Date: Mon, 9 Apr 2018 12:07:21 +0000 Subject: [PATCH 1/3] loader/i386: fix out of bound memory copy on non-UEFI linux Ref: https://bugzilla.opensuse.org/show_bug.cgi?id=1029187 Ref: https://build.opensuse.org/package/rdiff/openSUSE:Factory/grub2?linkrev=base&rev=159 --- grub-core/loader/i386/linux.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grub-core/loader/i386/linux.c b/grub-core/loader/i386/linux.c index 5fdfea312..0888c68b7 100644 --- a/grub-core/loader/i386/linux.c +++ b/grub-core/loader/i386/linux.c @@ -826,7 +826,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), len = sizeof (linux_params) - sizeof (lh); - grub_memcpy (&linux_params + sizeof (lh), kernel + kernel_offset, len); + grub_memcpy ((char *) &linux_params + sizeof (lh), kernel + kernel_offset, len); kernel_offset += len; linux_params.type_of_loader = GRUB_LINUX_BOOT_LOADER_TYPE; From 721b4677ab1c9486538fdbcfa4b0958e1cead9d6 Mon Sep 17 00:00:00 2001 From: Michael Chang Date: Mon, 26 Mar 2018 16:52:34 +0800 Subject: [PATCH 2/3] Fix packed-not-aligned error on GCC 8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When building with GCC 8, there are several errors regarding packed-not-aligned. ./include/grub/gpt_partition.h:79:1: error: alignment 1 of ‘struct grub_gpt_partentry’ is less than 8 [-Werror=packed-not-aligned] This patch fixes the build error by cleaning up the ambiguity of placing aligned structure in a packed one. In "struct grub_btrfs_time" and "struct grub_gpt_part_type", the aligned attribute seems to be superfluous, and also has to be packed, to ensure the structure is bit-to-bit mapped to the format laid on disk. I think we could blame to copy and paste error here for the mistake. In "struct efi_variable", we have to use grub_efi_packed_guid_t, as the name suggests. :) Signed-off-by: Michael Chang Tested-by: Michael Chang Tested-by: Paul Menzel Reviewed-by: Daniel Kiper (cherry picked from commit 563b1da6e6ae7af46cc8354cadb5dab416989f0a) --- grub-core/fs/btrfs.c | 2 +- include/grub/efiemu/runtime.h | 2 +- include/grub/gpt_partition.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/grub-core/fs/btrfs.c b/grub-core/fs/btrfs.c index 4849c1ceb..be195448d 100644 --- a/grub-core/fs/btrfs.c +++ b/grub-core/fs/btrfs.c @@ -175,7 +175,7 @@ struct grub_btrfs_time { grub_int64_t sec; grub_uint32_t nanosec; -} __attribute__ ((aligned (4))); +} GRUB_PACKED; struct grub_btrfs_inode { diff --git a/include/grub/efiemu/runtime.h b/include/grub/efiemu/runtime.h index 9b6b729f4..36d2dedf4 100644 --- a/include/grub/efiemu/runtime.h +++ b/include/grub/efiemu/runtime.h @@ -29,7 +29,7 @@ struct grub_efiemu_ptv_rel struct efi_variable { - grub_efi_guid_t guid; + grub_efi_packed_guid_t guid; grub_uint32_t namelen; grub_uint32_t size; grub_efi_uint32_t attributes; diff --git a/include/grub/gpt_partition.h b/include/grub/gpt_partition.h index 4730fe362..466735134 100644 --- a/include/grub/gpt_partition.h +++ b/include/grub/gpt_partition.h @@ -29,7 +29,7 @@ struct grub_gpt_guid grub_uint16_t data2; grub_uint16_t data3; grub_uint8_t data4[8]; -} __attribute__ ((aligned(8))); +} GRUB_PACKED; typedef struct grub_gpt_guid grub_gpt_guid_t; typedef struct grub_gpt_guid grub_gpt_part_type_t; From 1c4dc293dfd8c408521f7a07fc87ef1f4f08205b Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sat, 17 Feb 2018 06:47:28 -0800 Subject: [PATCH 3/3] x86-64: Treat R_X86_64_PLT32 as R_X86_64_PC32 Starting from binutils commit bd7ab16b4537788ad53521c45469a1bdae84ad4a: https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=bd7ab16b4537788ad53521c45469a1bdae84ad4a x86-64 assembler generates R_X86_64_PLT32, instead of R_X86_64_PC32, for 32-bit PC-relative branches. Grub2 should treat R_X86_64_PLT32 as R_X86_64_PC32. Signed-off-by: H.J. Lu Reviewed-by: Daniel Kiper (cherry picked from commit 842c390469e2c2e10b5aa36700324cd3bde25875) --- grub-core/efiemu/i386/loadcore64.c | 1 + grub-core/kern/x86_64/dl.c | 1 + util/grub-mkimagexx.c | 1 + util/grub-module-verifier.c | 1 + 4 files changed, 4 insertions(+) diff --git a/grub-core/efiemu/i386/loadcore64.c b/grub-core/efiemu/i386/loadcore64.c index e49d0b6ff..18facf47f 100644 --- a/grub-core/efiemu/i386/loadcore64.c +++ b/grub-core/efiemu/i386/loadcore64.c @@ -98,6 +98,7 @@ grub_arch_efiemu_relocate_symbols64 (grub_efiemu_segment_t segs, break; case R_X86_64_PC32: + case R_X86_64_PLT32: err = grub_efiemu_write_value (addr, *addr32 + rel->r_addend + sym.off diff --git a/grub-core/kern/x86_64/dl.c b/grub-core/kern/x86_64/dl.c index 440690673..3a73e6e6c 100644 --- a/grub-core/kern/x86_64/dl.c +++ b/grub-core/kern/x86_64/dl.c @@ -70,6 +70,7 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr, break; case R_X86_64_PC32: + case R_X86_64_PLT32: { grub_int64_t value; value = ((grub_int32_t) *addr32) + rel->r_addend + sym->st_value - diff --git a/util/grub-mkimagexx.c b/util/grub-mkimagexx.c index e63f148e4..f20255a28 100644 --- a/util/grub-mkimagexx.c +++ b/util/grub-mkimagexx.c @@ -832,6 +832,7 @@ SUFFIX (relocate_addresses) (Elf_Ehdr *e, Elf_Shdr *sections, break; case R_X86_64_PC32: + case R_X86_64_PLT32: { grub_uint32_t *t32 = (grub_uint32_t *) target; *t32 = grub_host_to_target64 (grub_target_to_host32 (*t32) diff --git a/util/grub-module-verifier.c b/util/grub-module-verifier.c index 9179285a5..a79271f66 100644 --- a/util/grub-module-verifier.c +++ b/util/grub-module-verifier.c @@ -19,6 +19,7 @@ struct grub_module_verifier_arch archs[] = { -1 }, (int[]){ R_X86_64_PC32, + R_X86_64_PLT32, -1 } },