grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] Support linux boot protocol >= 2.02 long command-lines


From: Alon Bar-Lev
Subject: [PATCH] Support linux boot protocol >= 2.02 long command-lines
Date: Sat, 3 May 2008 00:39:31 +0300
User-agent: KMail/1.9.9

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 <address@hidden>

---

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");




reply via email to

[Prev in Thread] Current Thread [Next in Thread]