[libvirt] [PATCH 09/30] storagefile: Push extension_end calc to qcow2GetBackingStoreFormat
Daniel Henrique Barboza
danielhb413 at gmail.com
Wed Oct 9 21:02:24 UTC 2019
On 10/7/19 6:49 PM, Cole Robinson wrote:
> This is a step towards making this qcow2GetBackingStoreFormat into
> a generic qcow2 extensions parser
>
> Signed-off-by: Cole Robinson <crobinso at redhat.com>
> ---
Reviewed-by: Daniel Henrique Barboza <danielhb413 at gmail.com>
> src/util/virstoragefile.c | 66 +++++++++++++++++++++------------------
> 1 file changed, 35 insertions(+), 31 deletions(-)
>
> diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
> index 4a3c9df7a2..b8f7faf580 100644
> --- a/src/util/virstoragefile.c
> +++ b/src/util/virstoragefile.c
> @@ -429,11 +429,11 @@ cowGetBackingStore(char **res,
> static int
> qcow2GetBackingStoreFormat(int *format,
> const char *buf,
> - size_t buf_size,
> - size_t extension_end)
> + size_t buf_size)
> {
> size_t offset;
> size_t extension_start;
> + size_t extension_end;
> int version = virReadBufInt32BE(buf + QCOWX_HDR_VERSION);
>
> if (version < 2) {
> @@ -447,6 +447,37 @@ qcow2GetBackingStoreFormat(int *format,
> else
> extension_start = virReadBufInt32BE(buf + QCOW2v3_HDR_SIZE);
>
> + /*
> + * Traditionally QCow2 files had a layout of
> + *
> + * [header]
> + * [backingStoreName]
> + *
> + * Although the backingStoreName typically followed
> + * the header immediately, this was not required by
> + * the format. By specifying a higher byte offset for
> + * the backing file offset in the header, it was
> + * possible to leave space between the header and
> + * start of backingStore.
> + *
> + * This hack is now used to store extensions to the
> + * qcow2 format:
> + *
> + * [header]
> + * [extensions]
> + * [backingStoreName]
> + *
> + * Thus the file region to search for extensions is
> + * between the end of the header (QCOW2_HDR_TOTAL_SIZE)
> + * and the start of the backingStoreName (offset)
> + *
> + * for qcow2 v3 images, the length of the header
> + * is stored at QCOW2v3_HDR_SIZE
> + */
> + extension_end = virReadBufInt64BE(buf + QCOWX_HDR_BACKING_FILE_OFFSET);
> + if (extension_end > buf_size)
> + return -1;
> +
> /*
> * The extensions take format of
> *
> @@ -506,6 +537,7 @@ qcowXGetBackingStore(char **res,
>
> if (buf_size < QCOWX_HDR_BACKING_FILE_OFFSET+8+4)
> return BACKING_STORE_INVALID;
> +
> offset = virReadBufInt64BE(buf + QCOWX_HDR_BACKING_FILE_OFFSET);
> if (offset > buf_size)
> return BACKING_STORE_INVALID;
> @@ -529,35 +561,7 @@ qcowXGetBackingStore(char **res,
> memcpy(*res, buf + offset, size);
> (*res)[size] = '\0';
>
> - /*
> - * Traditionally QCow2 files had a layout of
> - *
> - * [header]
> - * [backingStoreName]
> - *
> - * Although the backingStoreName typically followed
> - * the header immediately, this was not required by
> - * the format. By specifying a higher byte offset for
> - * the backing file offset in the header, it was
> - * possible to leave space between the header and
> - * start of backingStore.
> - *
> - * This hack is now used to store extensions to the
> - * qcow2 format:
> - *
> - * [header]
> - * [extensions]
> - * [backingStoreName]
> - *
> - * Thus the file region to search for extensions is
> - * between the end of the header (QCOW2_HDR_TOTAL_SIZE)
> - * and the start of the backingStoreName (offset)
> - *
> - * for qcow2 v3 images, the length of the header
> - * is stored at QCOW2v3_HDR_SIZE
> - */
> -
> - if (qcow2GetBackingStoreFormat(format, buf, buf_size, offset) < 0)
> + if (qcow2GetBackingStoreFormat(format, buf, buf_size) < 0)
> return BACKING_STORE_INVALID;
>
> return BACKING_STORE_OK;
More information about the libvir-list
mailing list