]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
2008-09-08 Robert Millan <rmh@aybabtu.com>
authorrobertmh <robertmh@localhost>
Mon, 8 Sep 2008 19:10:16 +0000 (19:10 +0000)
committerrobertmh <robertmh@localhost>
Mon, 8 Sep 2008 19:10:16 +0000 (19:10 +0000)
        * 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
loader/i386/pc/multiboot.c

index e78d3eeaf512402bbfafa8f1f94a79c283245a14..3342a87518be9ec748ad2ac737c770b562eed5b2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2008-09-08  Robert Millan  <rmh@aybabtu.com>
+
+       * 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  <rmh@aybabtu.com>
 
        * util/hostdisk.c (open_device): Replace a grub_util_info() call
index 725fac887814673b94bb938480a1bb7c8a22e9cc..c0d1fe1ca493f8931c694f8a950ace498c1c1141 100644 (file)
@@ -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);