Richard W.M. Jones
2011-Jul-12 16:21 UTC
[Libguestfs] [PATCH] part-get-bootable: Fix when partitions are missing or unordered (RHBZ#602997).
-- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones New in Fedora 11: Fedora Windows cross-compiler. Compile Windows programs, test, and build Windows installers. Over 70 libraries supprt'd http://fedoraproject.org/wiki/MinGW http://www.annexia.org/fedora_mingw -------------- next part -------------->From 523a12e4e7939d00e4c7e09a5de534bc2e5baa3a Mon Sep 17 00:00:00 2001From: "Richard W.M. Jones" <rjones at redhat.com> Date: Tue, 12 Jul 2011 17:18:48 +0100 Subject: [PATCH] part-get-bootable: Fix when partitions are missing or unordered (RHBZ#602997). --- daemon/parted.c | 34 +++++++++++++++++++-- regressions/Makefile.am | 1 + regressions/rhbz602997.sh | 71 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 102 insertions(+), 4 deletions(-) create mode 100755 regressions/rhbz602997.sh diff --git a/daemon/parted.c b/daemon/parted.c index d52ad2c..2b70fdd 100644 --- a/daemon/parted.c +++ b/daemon/parted.c @@ -573,15 +573,41 @@ do_part_get_bootable (const char *device, int partnum) /* New-style parsing using the "machine-readable" format from * 'parted -m'. * - * We want lines[1+partnum]. + * Partitions may not be in any order, so we have to look for + * the matching partition number (RHBZ#602997). */ - if (count_strings (lines) < (size_t) 1+partnum) { - reply_with_error ("partition number out of range: %d", partnum); + if (lines[0] == NULL || STRNEQ (lines[0], "BYT;")) { + reply_with_error ("unknown signature, expected \"BYT;\" as first line of the output: %s", + lines[0] ? lines[0] : "(signature was null)"); + free_strings (lines); + return -1; + } + + if (lines[1] == NULL) { + reply_with_error ("parted didn't return a line describing the device"); + free_strings (lines); + return -1; + } + + size_t row; + int pnum; + for (row = 2; lines[row] != NULL; ++row) { + if (sscanf (lines[row], "%d:", &pnum) != 1) { + reply_with_error ("could not parse row from output of parted print command: %s", lines[row]); + free_strings (lines); + return -1; + } + if (pnum == partnum) + break; + } + + if (lines[row] == NULL) { + reply_with_error ("partition number %d not found", partnum); free_strings (lines); return -1; } - char *boot = get_table_field (lines[1+partnum], 6); + char *boot = get_table_field (lines[row], 6); if (boot == NULL) { free_strings (lines); return -1; diff --git a/regressions/Makefile.am b/regressions/Makefile.am index fada841..a612ee3 100644 --- a/regressions/Makefile.am +++ b/regressions/Makefile.am @@ -32,6 +32,7 @@ TESTS = \ rhbz576879.sh \ rhbz578407.sh \ rhbz580246.sh \ + rhbz602997.sh \ rhbz690819.sh \ test-add-domain.sh \ test-both-ends-cancel.sh \ diff --git a/regressions/rhbz602997.sh b/regressions/rhbz602997.sh new file mode 100755 index 0000000..42fd3cb --- /dev/null +++ b/regressions/rhbz602997.sh @@ -0,0 +1,71 @@ +#!/bin/bash - +# libguestfs +# Copyright (C) 2011 Red Hat Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +# https://bugzilla.redhat.com/show_bug.cgi?id=602997 +# Fix part-get-bootable to work with missing/unordered partitions. + +set -e +export LANG=C + +guestfish=../fish/guestfish + +rm -f test.img test.output + +$guestfish > test.output <<EOF +sparse test.img 100M +run +part-init /dev/sda mbr +# Create an unordered layout. +# This places part 2 in front of part 1. +part-add /dev/sda p 1001 2000 +part-add /dev/sda p 1 1000 +#part-list /dev/sda +part-set-bootable /dev/sda 1 true +part-get-bootable /dev/sda 1 +part-get-bootable /dev/sda 2 +EOF + +if [ "$(cat test.output)" != "true +false" ]; then + echo "rhbz602997.sh: Unexpected output from test:" + cat test.output + echo "[end of output]" + exit 1 +fi + +$guestfish > test.output <<EOF +sparse test.img 100M +run +part-init /dev/sda mbr +part-add /dev/sda p 1 1000 +part-add /dev/sda p 1001 2000 +part-add /dev/sda p 2001 3000 +part-del /dev/sda 2 +#part-list /dev/sda +part-get-bootable /dev/sda 3 +ping-daemon +EOF + +if [ "$(cat test.output)" != "false" ]; then + echo "rhbz602997.sh: Unexpected output from test:" + cat test.output + echo "[end of output]" + exit 1 +fi + +rm -f test.img test.output -- 1.7.5.2
Apparently Analagous Threads
- [PATCH] inspect: Don't fail for Windows guests with multiple disks (RHBZ#674130).
- [PATCH version 2] guestfish: Use xstrtol to parse integers (RHBZ#557655).
- [PATCH] Add version numbers to Perl modules (RHBZ#521674).
- [PATCH] Improved error if virt-inspector cannot find OSes in image (RHBZ#591142).
- [PATCH] virt-df: Disallow -h and --csv options together (RHBZ#600977).