Continue from bug#13606 [1] cmd_line_ptr should not be truncated to 256.
Please review this patch or apply something better. Tested for pc/linux, guess for efi/linux. For EFI I did not understand what the lh.cl_offset = 0 is for, but as only recent boot protocols are supported I am not sure it is required. Signed-off-by: Alon Bar-Lev <[EMAIL PROTECTED]> --- Index: include/grub/i386/linux.h =================================================================== RCS file: /sources/grub/grub2/include/grub/i386/linux.h,v retrieving revision 1.4 diff -u -B -r1.4 linux.h --- include/grub/i386/linux.h 25 Apr 2008 19:41:49 -0000 1.4 +++ include/grub/i386/linux.h 2 May 2008 21:35:56 -0000 @@ -41,7 +41,9 @@ #define GRUB_LINUX_CL_OFFSET 0x9000 #define GRUB_LINUX_CL_END_OFFSET 0x90FF -#define GRUB_LINUX_SETUP_MOVE_SIZE 0x9100 +#define GRUB_LINUX_CL_0202_OFFSET 0x9100 +#define GRUB_LINUX_CL_0202_END_OFFSET 0x9FFF +#define GRUB_LINUX_SETUP_MOVE_SIZE 0xA000 #define GRUB_LINUX_CL_MAGIC 0xA33F #define GRUB_LINUX_EFI_SIGNATURE \ Index: loader/i386/efi/linux.c =================================================================== RCS file: /sources/grub/grub2/loader/i386/efi/linux.c,v retrieving revision 1.2 diff -u -B -r1.2 linux.c --- loader/i386/efi/linux.c 21 Jul 2007 23:32:28 -0000 1.2 +++ loader/i386/efi/linux.c 2 May 2008 21:35:58 -0000 @@ -391,8 +391,8 @@ lh.type_of_loader = 0x50; lh.cl_magic = GRUB_LINUX_CL_MAGIC; - lh.cl_offset = GRUB_LINUX_CL_END_OFFSET; - lh.cmd_line_ptr = (char *) real_mode_mem + GRUB_LINUX_CL_OFFSET; + lh.cl_offset = 0; + lh.cmd_line_ptr = (char *) real_mode_mem + GRUB_LINUX_CL_0202_OFFSET; lh.ramdisk_image = 0; lh.ramdisk_size = 0; @@ -531,7 +531,7 @@ } /* Specify the boot file. */ - dest = grub_stpcpy ((char *) real_mode_mem + GRUB_LINUX_CL_OFFSET, + dest = grub_stpcpy ((char *) real_mode_mem + GRUB_LINUX_CL_0202_OFFSET, "BOOT_IMAGE="); dest = grub_stpcpy (dest, argv[0]); @@ -539,7 +539,7 @@ for (i = 1; i < argc && dest + grub_strlen (argv[i]) + 1 < ((char *) real_mode_mem - + GRUB_LINUX_CL_END_OFFSET); + + GRUB_LINUX_CL_0202_END_OFFSET); i++) { *dest++ = ' '; Index: loader/i386/pc/linux.c =================================================================== RCS file: /sources/grub/grub2/loader/i386/pc/linux.c,v retrieving revision 1.18 diff -u -B -r1.18 linux.c --- loader/i386/pc/linux.c 8 Jan 2008 11:38:18 -0000 1.18 +++ loader/i386/pc/linux.c 2 May 2008 21:35:58 -0000 @@ -117,7 +117,7 @@ } if (grub_le_to_cpu16 (lh.version) >= 0x0202) - lh.cmd_line_ptr = grub_linux_real_addr + GRUB_LINUX_CL_OFFSET; + lh.cmd_line_ptr = grub_linux_real_addr + GRUB_LINUX_CL_0202_OFFSET; else { lh.cl_magic = grub_cpu_to_le16 (GRUB_LINUX_CL_MAGIC); @@ -244,7 +244,7 @@ << GRUB_DISK_SECTOR_BITS)); /* Specify the boot file. */ - dest = grub_stpcpy (grub_linux_tmp_addr + GRUB_LINUX_CL_OFFSET, + dest = grub_stpcpy (grub_linux_tmp_addr + GRUB_LINUX_CL_0202_OFFSET, "BOOT_IMAGE="); dest = grub_stpcpy (dest, argv[0]); @@ -252,13 +252,18 @@ for (i = 1; i < argc && dest + grub_strlen (argv[i]) + 1 < (grub_linux_tmp_addr - + GRUB_LINUX_CL_END_OFFSET); + + GRUB_LINUX_CL_0202_END_OFFSET); i++) { *dest++ = ' '; dest = grub_stpcpy (dest, argv[i]); } + grub_strncpy (grub_linux_tmp_addr + GRUB_LINUX_CL_OFFSET, + grub_linux_tmp_addr + GRUB_LINUX_CL_0202_OFFSET, + GRUB_LINUX_CL_END_OFFSET - GRUB_LINUX_CL_OFFSET - 1); + *(grub_linux_tmp_addr + GRUB_LINUX_CL_END_OFFSET) = '\0'; + len = prot_size; if (grub_file_read (file, (char *) GRUB_LINUX_BZIMAGE_ADDR, len) != len) grub_error (GRUB_ERR_FILE_READ_ERROR, "Couldn't read file"); _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel