Felix Zielcke wrote on 20080903:

> could you please address Marco's issues and send a new patch so the
> topic is brought up again?

Please find attached a new patch. I hope I managed to fix all remarks
that were made ;-) If not then please let me know.

This is intended for the Changelog :

2008-09-09  Hans Lambermont  <[EMAIL PROTECTED]>

       * disk/lvm.c (grub_lvm_scan_device): Allocate buffer space for the
       circular metadata worst case scenario. If the metadata is circular
       then copy the wrap in place.
       * include/grub/lvm.h: Add GRUB_LVM_MDA_HEADER_SIZE, from the LVM2
       project lib/format_text/layout.h
       Circular metadata bug found and patch debugged by
       Jan Derk Gerlings  <[EMAIL PROTECTED]>

The 'svn diff --diff-cmd diff -x -up' style patch is attached.

regards,
   Hans Lambermont
-- 
Hans Lambermont, M.Sc.  -  Newtec  -  OS-Platform&VAS
http://newtec.eu/    t:+31408519234    m:+31629064887
Index: disk/lvm.c
===================================================================
--- disk/lvm.c	(revision 1858)
+++ disk/lvm.c	(working copy)
@@ -281,7 +281,8 @@ grub_lvm_scan_device (const char *name)
       goto fail;
     }
 
-  metadatabuf = grub_malloc (mda_size);
+  /* Allocate buffer space for the circular worst-case scenario. */
+  metadatabuf = grub_malloc (2 * mda_size);
   if (! metadatabuf)
     goto fail;
 
@@ -300,6 +301,16 @@ grub_lvm_scan_device (const char *name)
     }
 
   rlocn = mdah->raw_locns;
+  if (grub_le_to_cpu64 (rlocn->offset) + grub_le_to_cpu64 (rlocn->size) >
+      grub_le_to_cpu64 (mdah->size))
+    {
+      /* Metadata is circular. Copy the wrap in place. */
+      grub_memcpy (metadatabuf + mda_size,
+                   metadatabuf + GRUB_LVM_MDA_HEADER_SIZE,
+                   grub_le_to_cpu64 (rlocn->offset) +
+                   grub_le_to_cpu64 (rlocn->size) -
+                   grub_le_to_cpu64 (mdah->size));
+    }
   p = q = metadatabuf + grub_le_to_cpu64 (rlocn->offset);
 
   while (*q != ' ' && q < metadatabuf + mda_size)
Index: include/grub/lvm.h
===================================================================
--- include/grub/lvm.h	(revision 1858)
+++ include/grub/lvm.h	(working copy)
@@ -103,6 +103,7 @@ struct grub_lvm_pv_header {
 
 #define GRUB_LVM_FMTT_MAGIC "\040\114\126\115\062\040\170\133\065\101\045\162\060\116\052\076"
 #define GRUB_LVM_FMTT_VERSION 1
+#define GRUB_LVM_MDA_HEADER_SIZE 512
 
 /* On disk */
 struct grub_lvm_raw_locn {
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to