Felix Zielcke wrote on 20080828: > Am Donnerstag, den 28.08.2008, 13:14 +0200 schrieb Hans Lambermont: >> My colleague Jan Derk Gerlings found a bug in the way grub 1.96, svn >> version 20080813 (and earlier) reads the circular lvm2 metadata >> buffer. > > Great, on Debian BTS we have 2 bugs [0] related to LVM and I wasn't > able yet to trace them down, but that could be the reason for them. > >> Shall we attempt to fix this and send a patch ? > > Yes please do :)
Please find the patch attached, this was tested with circular metadata and the segfault in grub-setup is gone and the system boots fine. > Because GRUB is a GNU project, you have to obey the GNU Coding Standards [1] Ok, I hope I got it right. If not please let me know. regards, Hans Lambermont -- Hans Lambermont, M.Sc. - Newtec - OS-Platform&VAS http://newtec.eu/ t:+31408519234 m:+31629064887
diff -uwr grub-1.96_svn20080813-org/ChangeLog grub-1.96_svn20080813-new/ChangeLog --- grub-1.96_svn20080813-org/ChangeLog 2008-08-13 17:24:36.000000000 +0200 +++ grub-1.96_svn20080813-new/ChangeLog 2008-08-29 10:33:03.000000000 +0200 @@ -1,3 +1,8 @@ +2008-08-28 Hans Lambermont <[EMAIL PROTECTED]> (tiny change) + Jan Derk Gerlings <[EMAIL PROTECTED]> (tiny change) + + * disk/lvm.c: Add capability to read circular metadata + 2008-08-12 Robert Millan <[EMAIL PROTECTED]> * loader/i386/pc/multiboot.c (grub_multiboot_load_elf32): Move part diff -uwr grub-1.96_svn20080813-org/disk/lvm.c grub-1.96_svn20080813-new/disk/lvm.c --- grub-1.96_svn20080813-org/disk/lvm.c 2008-08-28 14:32:53.000000000 +0200 +++ grub-1.96_svn20080813-new/disk/lvm.c 2008-08-28 18:31:19.000000000 +0200 @@ -281,7 +281,8 @@ goto fail; } - metadatabuf = grub_malloc (mda_size); + /* alloc for circular worst-case scenario */ + metadatabuf = grub_malloc (2*mda_size); if (! metadatabuf) goto fail; @@ -300,6 +301,12 @@ } rlocn = mdah->raw_locns; + if (rlocn->offset + rlocn->size > mdah->size) + { + /* metadata is circular */ + grub_memcpy(metadatabuf + mda_size, metadatabuf + mdah->start, + ((rlocn->offset + rlocn->size) - mdah->size)); + } p = q = metadatabuf + grub_le_to_cpu64 (rlocn->offset); while (*q != ' ' && q < metadatabuf + mda_size)
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel