]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
size field in tagged mbi
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sat, 16 Jan 2010 16:18:02 +0000 (17:18 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sat, 16 Jan 2010 16:18:02 +0000 (17:18 +0100)
loader/i386/multiboot_mbi2.c

index de234727b3594b516c7cbaa72d6f04d90ad23b4b..636b6392318dcb7c2fa1c66b4de9ba737ed05a85 100644 (file)
@@ -62,7 +62,7 @@ static grub_uint32_t biosdev, slice, part;
 grub_size_t
 grub_multiboot_get_mbi_size (void)
 {
-  return sizeof (struct multiboot_tag)
+  return sizeof (grub_uint32_t) + sizeof (struct multiboot_tag)
     + (sizeof (struct multiboot_tag_string) + ALIGN_UP (cmdline_size, 4))
     + (sizeof (struct multiboot_tag_string)
        + ALIGN_UP (sizeof (PACKAGE_STRING), 4))
@@ -221,12 +221,15 @@ grub_err_t
 grub_multiboot_make_mbi (void *orig, grub_uint32_t dest, grub_off_t buf_off,
                         grub_size_t bufsize)
 {
-  grub_uint8_t *ptrorig = (grub_uint8_t *) orig + buf_off;
+  grub_uint8_t *ptrorig;
+  grub_uint8_t *mbistart = (grub_uint8_t *) orig + buf_off;
   grub_err_t err;
 
   if (bufsize < grub_multiboot_get_mbi_size ())
     return grub_error (GRUB_ERR_OUT_OF_MEMORY, "mbi buffer is too small");
 
+  ptrorig = (grub_uint8_t *) orig + buf_off + sizeof (grub_uint32_t);
+
   {
     struct multiboot_tag_string *tag = (struct multiboot_tag_string *) ptrorig;
     tag->type = MULTIBOOT_TAG_TYPE_CMDLINE;
@@ -314,6 +317,8 @@ grub_multiboot_make_mbi (void *orig, grub_uint32_t dest, grub_off_t buf_off,
     ptrorig += tag->size;
   }
 
+  *(grub_uint32_t *) mbistart = ptrorig - mbistart;
+
   return GRUB_ERR_NONE;
 }