diff --git a/ChangeLog b/ChangeLog index 1eeeb7ddb..f4716b4d8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2002-04-30 Yoshinori K. Okuji + + From Jean-Jacques Michel : + * stage2/boot.c (load_image): For Linux, check if DATA_LEN is + greater than MULTIBOOT_SEARCH. If that's true, read the rest + after copying data already read in BUFFER. + 2002-04-30 Yoshinori K. Okuji * stage2/boot.c (load_image): For Linux, don't check if the diff --git a/THANKS b/THANKS index dd555b2e7..b9685b27e 100644 --- a/THANKS +++ b/THANKS @@ -45,6 +45,7 @@ HORIKAWA Kazunori Jan Fricke Jan Zerebecki Jason Thomas +Jean-Jacques Michel Jeremy Katz Jochen Hoenicke Johannes Kroeger diff --git a/stage2/boot.c b/stage2/boot.c index ab8f8bc36..466ce71bf 100644 --- a/stage2/boot.c +++ b/stage2/boot.c @@ -352,8 +352,18 @@ load_image (char *kernel, char *arg, kernel_t suggested_type, else linux_mem_size = 0; } - - memmove ((char *) LINUX_SETUP, buffer, data_len + SECTOR_SIZE); + + /* It is possible that DATA_LEN is greater than MULTIBOOT_SEARCH, + so the data may have been read partially. */ + if (data_len <= MULTIBOOT_SEARCH) + grub_memmove ((char *) LINUX_SETUP, buffer, + data_len + SECTOR_SIZE); + else + { + grub_memmove ((char *) LINUX_SETUP, buffer, MULTIBOOT_SEARCH); + grub_read ((char *) LINUX_SETUP + MULTIBOOT_SEARCH, + data_len + SECTOR_SIZE - MULTIBOOT_SEARCH); + } if (lh->header != LINUX_MAGIC_SIGNATURE || lh->version < 0x0200)