From 89d5ffcfd1cd2fe89e5ded67998e6a52cc7973e1 Mon Sep 17 00:00:00 2001 From: robertmh Date: Mon, 8 Sep 2008 19:10:16 +0000 Subject: [PATCH] 2008-09-08 Robert Millan * loader/i386/pc/multiboot.c (grub_multiboot_load_elf32): Skip segments when their filesz is zero (grub_file_read() interprets zero-size as "read untill EOF", which results in memory corruption). Use `lowest_segment' rather than 0 for calculating the current segment load address. --- ChangeLog | 8 ++++++++ loader/i386/pc/multiboot.c | 6 +++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index e78d3eeaf..3342a8751 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-09-08 Robert Millan + + * loader/i386/pc/multiboot.c (grub_multiboot_load_elf32): Skip + segments when their filesz is zero (grub_file_read() interprets + zero-size as "read untill EOF", which results in memory corruption). + Use `lowest_segment' rather than 0 for calculating the current + segment load address. + 2008-09-08 Robert Millan * util/hostdisk.c (open_device): Replace a grub_util_info() call diff --git a/loader/i386/pc/multiboot.c b/loader/i386/pc/multiboot.c index 725fac887..c0d1fe1ca 100644 --- a/loader/i386/pc/multiboot.c +++ b/loader/i386/pc/multiboot.c @@ -158,7 +158,7 @@ grub_multiboot_load_elf32 (grub_file_t file, void *buffer) #define phdr(i) ((Elf32_Phdr *) (phdr_base + (i) * ehdr->e_phentsize)) for (i = 0; i < ehdr->e_phnum; i++) - if (phdr(i)->p_type == PT_LOAD) + if (phdr(i)->p_type == PT_LOAD && phdr(i)->p_filesz != 0) { if (phdr(i)->p_paddr < phdr(lowest_segment)->p_paddr) lowest_segment = i; @@ -177,9 +177,9 @@ grub_multiboot_load_elf32 (grub_file_t file, void *buffer) /* Load every loadable segment in memory. */ for (i = 0; i < ehdr->e_phnum; i++) { - if (phdr(i)->p_type == PT_LOAD) + if (phdr(i)->p_type == PT_LOAD && phdr(i)->p_filesz != 0) { - char *load_this_module_at = (char *) (grub_multiboot_payload_orig + (phdr(i)->p_paddr - phdr(0)->p_paddr)); + char *load_this_module_at = (char *) (grub_multiboot_payload_orig + (phdr(i)->p_paddr - phdr(lowest_segment)->p_paddr)); grub_dprintf ("multiboot_loader", "segment %d: paddr=%p, memsz=0x%x\n", i, (void *) phdr(i)->p_paddr, phdr(i)->p_memsz);