diff mbox series

[for-2.12,07/12] parallels: Check maximum cluster size on create

Message ID 20180320173632.25480-8-kwolf@redhat.com
State New
Headers show
Series block: Follow-up for .bdrv_co_create (part 1) | expand

Commit Message

Kevin Wolf March 20, 2018, 5:36 p.m. UTC
It's unclear what the real maximum cluster size is for the Parallels
format, but let's at least make sure that we don't get integer
overflows in our .bdrv_co_create implementation.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 block/parallels.c | 5 +++++
 1 file changed, 5 insertions(+)

Comments

Eric Blake March 20, 2018, 6:34 p.m. UTC | #1
On 03/20/2018 12:36 PM, Kevin Wolf wrote:
> It's unclear what the real maximum cluster size is for the Parallels
> format, but let's at least make sure that we don't get integer
> overflows in our .bdrv_co_create implementation.
> 
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
>   block/parallels.c | 5 +++++
>   1 file changed, 5 insertions(+)
> 
> diff --git a/block/parallels.c b/block/parallels.c
> index 2da5e56a9d..e4ca018c2e 100644
> --- a/block/parallels.c
> +++ b/block/parallels.c
> @@ -526,6 +526,11 @@ static int coroutine_fn parallels_co_create(BlockdevCreateOptions* opts,
>           cl_size = DEFAULT_CLUSTER_SIZE;
>       }
>   
> +    /* XXX What is the real limit here? This is an insanely large maximum. */
> +    if (cl_size >= UINT64_MAX / MAX_PARALLELS_IMAGE_FACTOR) {

INT64_MAX is probably a saner starting point for the division...

> +        error_setg(errp, "Cluster size is too large");
> +        return -EINVAL;
> +    }
>       if (total_size >= MAX_PARALLELS_IMAGE_FACTOR * cl_size) {

since total_size still has to fit within off_t (63 bits, not 64)

>           error_setg(errp, "Image size is too large for this cluster size");
>           return -E2BIG;
> 

With that change,
Reviewed-by: Eric Blake <eblake@redhat.com>
diff mbox series

Patch

diff --git a/block/parallels.c b/block/parallels.c
index 2da5e56a9d..e4ca018c2e 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -526,6 +526,11 @@  static int coroutine_fn parallels_co_create(BlockdevCreateOptions* opts,
         cl_size = DEFAULT_CLUSTER_SIZE;
     }
 
+    /* XXX What is the real limit here? This is an insanely large maximum. */
+    if (cl_size >= UINT64_MAX / MAX_PARALLELS_IMAGE_FACTOR) {
+        error_setg(errp, "Cluster size is too large");
+        return -EINVAL;
+    }
     if (total_size >= MAX_PARALLELS_IMAGE_FACTOR * cl_size) {
         error_setg(errp, "Image size is too large for this cluster size");
         return -E2BIG;