as an image filename. This is preparational commit to read snapshot information from XML. This is the only global parameter which will be kept in BDRVParallelsState, the rest should be layered down into snapshots information structure.
Signed-off-by: Denis V. Lunev <d...@openvz.org> CC: Jeff Cody <jc...@redhat.com> CC: Kevin Wolf <kw...@redhat.com> CC: Stefan Hajnoczi <stefa...@redhat.com> --- block/parallels.c | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/block/parallels.c b/block/parallels.c index 718274b..0c0e669 100644 --- a/block/parallels.c +++ b/block/parallels.c @@ -107,6 +107,7 @@ static int parallels_open_image(BlockDriverState *bs, Error **errp) int i; struct parallels_header ph; int ret; + int64_t total_sectors; bs->read_only = 1; // no write support yet @@ -115,20 +116,35 @@ static int parallels_open_image(BlockDriverState *bs, Error **errp) goto fail; } - bs->total_sectors = le64_to_cpu(ph.nb_sectors); + total_sectors = le64_to_cpu(ph.nb_sectors); if (le32_to_cpu(ph.version) != HEADER_VERSION) { goto fail_format; } if (!memcmp(ph.magic, HEADER_MAGIC, 16)) { s->off_multiplier = 1; - bs->total_sectors = 0xffffffff & bs->total_sectors; + total_sectors = 0xffffffff & total_sectors; } else if (!memcmp(ph.magic, HEADER_MAGIC2, 16)) { s->off_multiplier = le32_to_cpu(ph.tracks); } else { goto fail_format; } + if (total_sectors == 0) { + error_setg(errp, "Invalid image: zero total sectors"); + ret = -EINVAL; + goto fail; + } + if (bs->total_sectors == 0) { + /* no descriptor file, standalone image opened */ + bs->total_sectors = total_sectors; + } + if (bs->total_sectors != total_sectors) { + error_setg(errp, "Invalid image: wrong total sectors"); + ret = -EINVAL; + goto fail; + } + s->tracks = le32_to_cpu(ph.tracks); if (s->tracks == 0) { error_setg(errp, "Invalid image: Zero sectors per track"); @@ -234,7 +250,7 @@ static int parallels_open_xml(BlockDriverState *bs, int flags, Error **errp) int size, ret; xmlDoc *doc = NULL; xmlNode *root, *image; - char *xml = NULL; + char *xml = NULL, *endptr; const char *data; char image_path[PATH_MAX]; Error *local_err = NULL; @@ -271,7 +287,6 @@ static int parallels_open_xml(BlockDriverState *bs, int flags, Error **errp) data = xml_get_text(root, "Disk_Parameters", "Padding", NULL); if (data != NULL) { - char *endptr; unsigned long pad; pad = strtoul(data, &endptr, 0); @@ -281,6 +296,16 @@ static int parallels_open_xml(BlockDriverState *bs, int flags, Error **errp) s->padding = (uint32_t)pad; } + data = xml_get_text(root, "Disk_Parameters", "Disk_size", NULL); + if (data == NULL) { + goto fail; + } else { + bs->total_sectors = strtoull(data, &endptr, 0); + if (endptr != NULL && *endptr != '\0') { + goto fail; + } + } + image = xml_seek(root, "StorageData", "Storage", "Image", NULL); data = ""; /* make gcc happy */ for (size = 0; image != NULL; image = image->next) { -- 1.9.1