+2008-10-05 Hans Lambermont <hans@lambermont.dyndns.org>
+
+ * 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.
+
2008-10-03 Felix Zielcke <fzielcke@z-51.de>
* util/i386/pc/grub-install.in: Source grub-mkconfig_lib instead of update-grub_lib.
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;
}
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)
#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 {