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.
This commit is contained in:
robertmh 2008-10-05 10:51:23 +00:00
parent 7a36edcafd
commit 1b7748eb13
3 changed files with 22 additions and 1 deletions

View file

@ -1,3 +1,12 @@
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> 2008-10-03 Felix Zielcke <fzielcke@z-51.de>
* util/i386/pc/grub-install.in: Source grub-mkconfig_lib instead of update-grub_lib. * util/i386/pc/grub-install.in: Source grub-mkconfig_lib instead of update-grub_lib.

View file

@ -281,7 +281,8 @@ grub_lvm_scan_device (const char *name)
goto fail; goto fail;
} }
metadatabuf = grub_malloc (mda_size); /* Allocate buffer space for the circular worst-case scenario. */
metadatabuf = grub_malloc (2 * mda_size);
if (! metadatabuf) if (! metadatabuf)
goto fail; goto fail;
@ -300,6 +301,16 @@ grub_lvm_scan_device (const char *name)
} }
rlocn = mdah->raw_locns; 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); p = q = metadatabuf + grub_le_to_cpu64 (rlocn->offset);
while (*q != ' ' && q < metadatabuf + mda_size) while (*q != ' ' && q < metadatabuf + mda_size)

View file

@ -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_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_FMTT_VERSION 1
#define GRUB_LVM_MDA_HEADER_SIZE 512
/* On disk */ /* On disk */
struct grub_lvm_raw_locn { struct grub_lvm_raw_locn {