[igt-dev] [PATCH i-g-t] lib/intel_blt.c: ensure uint64_t result of multiplication
Kamil Konieczny
kamil.konieczny at linux.intel.com
Wed Oct 18 15:28:07 UTC 2023
Hi Marcin,
On 2023-10-17 at 14:36:54 +0000, Marcin Bernatowicz wrote:
> Additionally check for overflow.
- ^^^^^^^^^^^^
This type was from the start uint64, so imho change subject from:
lib/intel_blt.c: ensure uint64_t result of multiplication
------------ ^^
sidenote: remove ".c"
into:
lib/intel_blt: check for overflow in multiplication
and adjust description.
>
> This should allow to exercise large buffers
> ex. xe_exercise_blt -W 16384 -H 16384
Please explain - this should fit in 32bit? 16K*16K*32 = 0x40000000
Or do you mean much higher values for W and H?
>
> Signed-off-by: Marcin Bernatowicz <marcin.bernatowicz at linux.intel.com>
> ---
> lib/intel_blt.c | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/lib/intel_blt.c b/lib/intel_blt.c
> index a76c7a404..f46c85e91 100644
> --- a/lib/intel_blt.c
> +++ b/lib/intel_blt.c
> @@ -1607,12 +1607,18 @@ blt_create_object(const struct blt_copy_data *blt, uint32_t region,
> bool create_mapping)
> {
> struct blt_copy_object *obj;
> - uint64_t size = width * height * bpp / 8;
> uint32_t stride = tiling == T_LINEAR ? width * 4 : width;
> uint32_t handle;
> + uint64_t size;
>
> igt_assert_f(blt->driver, "Driver isn't set, have you called blt_copy_init()?\n");
>
> + igt_assert_f((UINT64_MAX / 8) >= width &&
----------------- ^^^^^^^^^^^^^^
This is not needed, it checks for MAX >= w * 8, while you want
size > 0, imho add a second assert after calculating size.
Regards,
Kamil
> + (UINT64_MAX / width) >= height &&
> + (UINT64_MAX / (width * height)) >= bpp, "Overflow detected!\n");
> +
> + size = (uint64_t)width * height * bpp / 8;
> +
> obj = calloc(1, sizeof(*obj));
>
> obj->size = size;
> --
> 2.42.0
>
More information about the igt-dev
mailing list