diff -u -8 -p -r1.19 multiboot.c
--- loader/i386/pc/multiboot.c  5 Mar 2008 05:09:35 -0000       1.19
+++ loader/i386/pc/multiboot.c  21 Mar 2008 11:20:01 -0000
@@ -134,18 +134,18 @@ grub_multiboot_load_elf32 (grub_file_t f
                               phdr->p_paddr + phdr->p_memsz,
                               grub_os_area_addr + grub_os_area_size);
 
           if (grub_file_seek (file, (grub_off_t) phdr->p_offset)
              == (grub_off_t) -1)
            return grub_error (GRUB_ERR_BAD_OS,
                               "invalid offset in program header");
 
-          if (grub_file_read (file, (void *) phdr->p_paddr, phdr->p_filesz)
-              != (grub_ssize_t) phdr->p_filesz)
+          if ((phdr->p_filesz > 0) && (grub_file_read (file, (void *) phdr->p_paddr, phdr->p_filesz)
+              != (grub_ssize_t) phdr->p_filesz))
            return grub_error (GRUB_ERR_BAD_OS,
                               "couldn't read segment from file");
 
           if (phdr->p_filesz < phdr->p_memsz)
             grub_memset ((char *) phdr->p_paddr + phdr->p_filesz, 0,
                         phdr->p_memsz - phdr->p_filesz);
 
           if ((entry >= phdr->p_vaddr) &&
@@ -221,18 +221,18 @@ grub_multiboot_load_elf64 (grub_file_t f
                               phdr->p_paddr + phdr->p_memsz,
                               (grub_uint64_t) grub_os_area_addr + (grub_uint64_t) grub_os_area_size);
 
          if (grub_file_seek (file, (grub_off_t) phdr->p_offset)
              == (grub_off_t) -1)
            return grub_error (GRUB_ERR_BAD_OS,
                               "invalid offset in program header");
 
-         if (grub_file_read (file, (void *) ((grub_uint32_t) phdr->p_paddr),
-                             phdr->p_filesz)
+         if ((phdr->p_filesz > 0) && (grub_file_read (file, (void *) ((grub_uint32_t) phdr->p_paddr),
+                             phdr->p_filesz))
               != (grub_ssize_t) phdr->p_filesz)
            return grub_error (GRUB_ERR_BAD_OS,
                               "couldn't read segment from file");
 
           if (phdr->p_filesz < phdr->p_memsz)
            grub_memset (((char *) ((grub_uint32_t) phdr->p_paddr)
                          + phdr->p_filesz),
                         0,
