From: Vladimir 'phcoder' Serbinenko Date: Tue, 16 Jul 2013 16:37:44 +0000 (+0200) Subject: * grub-core/loader/multiboot_elfxx.c: Check eip after v2p translation X-Git-Tag: grub-2.02-beta1~931 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=88f8d1463f6ecf56d4ec9ec16b25a6f5362ab057;p=thirdparty%2Fgrub.git * grub-core/loader/multiboot_elfxx.c: Check eip after v2p translation and not before. Reported by: Leon Drugi. --- diff --git a/ChangeLog b/ChangeLog index 57af49bb2..69492ef85 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2013-07-16 Vladimir Serbinenko + + * grub-core/loader/multiboot_elfxx.c: Check eip after v2p translation + and not before. + Reported by: Leon Drugi. + 2013-07-16 Vladimir Serbinenko * grub-core/kern/powerpc/ieee1275/startup.S: Handle unaligned bss. diff --git a/grub-core/loader/multiboot_elfxx.c b/grub-core/loader/multiboot_elfxx.c index 26984f49a..7189e016e 100644 --- a/grub-core/loader/multiboot_elfxx.c +++ b/grub-core/loader/multiboot_elfxx.c @@ -75,18 +75,6 @@ CONCAT(grub_multiboot_load_elf, XX) (grub_file_t file, const char *filename, voi if (ehdr->e_phoff + ehdr->e_phnum * ehdr->e_phentsize > MULTIBOOT_SEARCH) return grub_error (GRUB_ERR_BAD_OS, "program header at a too high offset"); -#ifdef MULTIBOOT_LOAD_ELF64 -# ifdef __mips - /* We still in 32-bit mode. */ - if (ehdr->e_entry < 0xffffffff80000000ULL) - return grub_error (GRUB_ERR_BAD_OS, "invalid entry point for ELF64"); -# else - /* We still in 32-bit mode. */ - if (ehdr->e_entry > 0xffffffff) - return grub_error (GRUB_ERR_BAD_OS, "invalid entry point for ELF64"); -# endif -#endif - phdr_base = (char *) buffer + ehdr->e_phoff; #define phdr(i) ((Elf_Phdr *) (phdr_base + (i) * ehdr->e_phentsize)) @@ -142,6 +130,19 @@ CONCAT(grub_multiboot_load_elf, XX) (grub_file_t file, const char *filename, voi { grub_multiboot_payload_eip = (ehdr->e_entry - phdr(i)->p_vaddr) + phdr(i)->p_paddr; +#ifdef MULTIBOOT_LOAD_ELF64 +# ifdef __mips + /* We still in 32-bit mode. */ + if ((ehdr->e_entry - phdr(i)->p_vaddr) + + phdr(i)->p_paddr < 0xffffffff80000000ULL) + return grub_error (GRUB_ERR_BAD_OS, "invalid entry point for ELF64"); +# else + /* We still in 32-bit mode. */ + if ((ehdr->e_entry - phdr(i)->p_vaddr) + + phdr(i)->p_paddr > 0xffffffff) + return grub_error (GRUB_ERR_BAD_OS, "invalid entry point for ELF64"); +# endif +#endif break; }