diff options
author | Richard W.M. Jones <rjones@redhat.com> | 2011-07-12 17:18:48 +0100 |
---|---|---|
committer | Richard W.M. Jones <rjones@redhat.com> | 2011-07-12 18:44:46 +0100 |
commit | 511c82df46f5c6f4a7f984fdb81d4691038ed6da (patch) | |
tree | 69278d95bf009f7f59710376f90cb131233b171f /daemon | |
parent | edd747a09060dd191277f1bcae827a94939cfb9d (diff) | |
download | libguestfs-511c82df46f5c6f4a7f984fdb81d4691038ed6da.tar.gz libguestfs-511c82df46f5c6f4a7f984fdb81d4691038ed6da.tar.xz libguestfs-511c82df46f5c6f4a7f984fdb81d4691038ed6da.zip |
part-get-bootable: Fix when partitions are missing or unordered (RHBZ#602997).
Diffstat (limited to 'daemon')
-rw-r--r-- | daemon/parted.c | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/daemon/parted.c b/daemon/parted.c index d52ad2c7..2b70fddd 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; |