Paul Mackerras
2013-Aug-07 03:56 UTC
[Libguestfs] [PATCH] Fix parsing of boot flag in do_part_get_bootable()
The code in do_part_get_bootable() assumes that if a partition has the bootable flag set, then that is the only flag. It compares the entire flags field with the string "boot". However, the boot flag isn't always the only flag. For instance, POWER systems typically have a bootable partition of type 0x41 (PPC PReP boot), which parted -m displays as: # parted -m -- f18.img unit b print BYT; /root/f18.img:16106127360B:file:512:512:msdos::; 1:1048576B:5242879B:4194304B:::boot, prep; That is, the flags field contains "boot, prep", and thus libguestfs fails to see that this partition is bootable. Ultimately this causes virt-resize to fail to set the bootable flag on the boot partition of the destination image, resulting in an image that won't boot. This patch fixes the problem by searching for the string "boot" within the flags field, instead of comparing the whole flags field. --- --- libguestfs-1.22.5/daemon/parted.c~ 2013-02-03 00:47:53.000000000 +1100 +++ libguestfs-1.22.5/daemon/parted.c 2013-08-02 11:16:49.921790245 +1000 @@ -628,7 +628,7 @@ if (boot == NULL) return -1; - return STREQ (boot, "boot"); + return strstr (boot, "boot") != NULL; } else { /* Old-style: First look for the line matching "^Number". */
Richard W.M. Jones
2013-Aug-07 11:28 UTC
[Libguestfs] [PATCH] Fix parsing of boot flag in do_part_get_bootable()
On Wed, Aug 07, 2013 at 01:56:26PM +1000, Paul Mackerras wrote:> The code in do_part_get_bootable() assumes that if a partition has the > bootable flag set, then that is the only flag. It compares the entire > flags field with the string "boot". However, the boot flag isn't > always the only flag. For instance, POWER systems typically have a > bootable partition of type 0x41 (PPC PReP boot), which parted -m > displays as: > > # parted -m -- f18.img unit b print > BYT; > /root/f18.img:16106127360B:file:512:512:msdos::; > 1:1048576B:5242879B:4194304B:::boot, prep; > > That is, the flags field contains "boot, prep", and thus libguestfs > fails to see that this partition is bootable. Ultimately this causes > virt-resize to fail to set the bootable flag on the boot partition of > the destination image, resulting in an image that won't boot. > > This patch fixes the problem by searching for the string "boot" within > the flags field, instead of comparing the whole flags field. > > --- > --- libguestfs-1.22.5/daemon/parted.c~ 2013-02-03 00:47:53.000000000 +1100 > +++ libguestfs-1.22.5/daemon/parted.c 2013-08-02 11:16:49.921790245 +1000 > @@ -628,7 +628,7 @@ > if (boot == NULL) > return -1; > > - return STREQ (boot, "boot"); > + return strstr (boot, "boot") != NULL; > } > else { > /* Old-style: First look for the line matching "^Number". */Thanks - ACKed and pushed. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming blog: http://rwmj.wordpress.com Fedora now supports 80 OCaml packages (the OPEN alternative to F#)