[PATCH] hw/display/framebuffer: Add cast to force 64x64 multiply

Peter Maydell posted 1 patch 5 months, 1 week ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20250710174312.1313177-1-peter.maydell@linaro.org
hw/display/framebuffer.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
[PATCH] hw/display/framebuffer: Add cast to force 64x64 multiply
Posted by Peter Maydell 5 months, 1 week ago
In framebuffer_update_display(), Coverity complains because we
multiply two values of type 'int' (which will be done as a 32x32
multiply and so in theory might overflow) and then add the result to
a ram_addr_t, which can be 64 bits.

4GB framebuffers are not plausible anyway, but keep Coverity happy
by adding casts which force these multiplies to be done as 64x64.

Coverity: CID 1487248
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
This is one of those ones where I'm on the fence about sticking
in the cast vs just marking it a false-positive.
---
 hw/display/framebuffer.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/hw/display/framebuffer.c b/hw/display/framebuffer.c
index 4485aa335bb..b4296e8a33e 100644
--- a/hw/display/framebuffer.c
+++ b/hw/display/framebuffer.c
@@ -95,9 +95,9 @@ void framebuffer_update_display(
     }
     first = -1;
 
-    addr += i * src_width;
-    src += i * src_width;
-    dest += i * dest_row_pitch;
+    addr += (uint64_t)i * src_width;
+    src += (uint64_t)i * src_width;
+    dest += (uint64_t)i * dest_row_pitch;
 
     snap = memory_region_snapshot_and_clear_dirty(mem, addr, src_width * rows,
                                                   DIRTY_MEMORY_VGA);
-- 
2.43.0
Re: [PATCH] hw/display/framebuffer: Add cast to force 64x64 multiply
Posted by Peter Maydell 4 months, 3 weeks ago
Ping -- any opinions/review about this one?

-- PMM

On Thu, 10 Jul 2025 at 18:43, Peter Maydell <peter.maydell@linaro.org> wrote:
>
> In framebuffer_update_display(), Coverity complains because we
> multiply two values of type 'int' (which will be done as a 32x32
> multiply and so in theory might overflow) and then add the result to
> a ram_addr_t, which can be 64 bits.
>
> 4GB framebuffers are not plausible anyway, but keep Coverity happy
> by adding casts which force these multiplies to be done as 64x64.
>
> Coverity: CID 1487248
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
> This is one of those ones where I'm on the fence about sticking
> in the cast vs just marking it a false-positive.
> ---
>  hw/display/framebuffer.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/hw/display/framebuffer.c b/hw/display/framebuffer.c
> index 4485aa335bb..b4296e8a33e 100644
> --- a/hw/display/framebuffer.c
> +++ b/hw/display/framebuffer.c
> @@ -95,9 +95,9 @@ void framebuffer_update_display(
>      }
>      first = -1;
>
> -    addr += i * src_width;
> -    src += i * src_width;
> -    dest += i * dest_row_pitch;
> +    addr += (uint64_t)i * src_width;
> +    src += (uint64_t)i * src_width;
> +    dest += (uint64_t)i * dest_row_pitch;
>
>      snap = memory_region_snapshot_and_clear_dirty(mem, addr, src_width * rows,
>                                                    DIRTY_MEMORY_VGA);
Re: [PATCH] hw/display/framebuffer: Add cast to force 64x64 multiply
Posted by Manos Pitsidianakis 4 months, 3 weeks ago
On Mon, Jul 21, 2025 at 4:58 PM Peter Maydell <peter.maydell@linaro.org> wrote:
>
> Ping -- any opinions/review about this one?
>
> -- PMM
>
> On Thu, 10 Jul 2025 at 18:43, Peter Maydell <peter.maydell@linaro.org> wrote:
> >
> > In framebuffer_update_display(), Coverity complains because we
> > multiply two values of type 'int' (which will be done as a 32x32
> > multiply and so in theory might overflow) and then add the result to
> > a ram_addr_t, which can be 64 bits.
> >
> > 4GB framebuffers are not plausible anyway, but keep Coverity happy
> > by adding casts which force these multiplies to be done as 64x64.
> >
> > Coverity: CID 1487248
> > Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> > ---
> > This is one of those ones where I'm on the fence about sticking
> > in the cast vs just marking it a false-positive.
> > ---
> >  hw/display/framebuffer.c | 6 +++---
> >  1 file changed, 3 insertions(+), 3 deletions(-)
> >
> > diff --git a/hw/display/framebuffer.c b/hw/display/framebuffer.c
> > index 4485aa335bb..b4296e8a33e 100644
> > --- a/hw/display/framebuffer.c
> > +++ b/hw/display/framebuffer.c
> > @@ -95,9 +95,9 @@ void framebuffer_update_display(
> >      }
> >      first = -1;
> >
> > -    addr += i * src_width;
> > -    src += i * src_width;
> > -    dest += i * dest_row_pitch;
> > +    addr += (uint64_t)i * src_width;
> > +    src += (uint64_t)i * src_width;
> > +    dest += (uint64_t)i * dest_row_pitch;
> >
> >      snap = memory_region_snapshot_and_clear_dirty(mem, addr, src_width * rows,
> >                                                    DIRTY_MEMORY_VGA);
>

Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>