[09/30] storagefile: Push extension_end calc to qcow2GetBackingStoreFormat

Message ID c1fc68054ca34a028a46598c2cca98137be68295.1570482718.git.crobinso@redhat.com
State Accepted
Commit 16fffd8257230ccf8c1f5dbb373314b49b5fe3bc
Headers show
Series
  • storagefile, security: qcow2 data_file support
Related show

Commit Message

Cole Robinson Oct. 7, 2019, 9:49 p.m.
This is a step towards making this qcow2GetBackingStoreFormat into
a generic qcow2 extensions parser

Signed-off-by: Cole Robinson <crobinso@redhat.com>

---
 src/util/virstoragefile.c | 66 +++++++++++++++++++++------------------
 1 file changed, 35 insertions(+), 31 deletions(-)

-- 
2.23.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Comments

Daniel Henrique Barboza Oct. 9, 2019, 9:02 p.m. | #1
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@redhat.com>

> ---


Reviewed-by: Daniel Henrique Barboza <danielhb413@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;


--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Patch

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;