+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
#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;
/* 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);