drm/xe: properly check bounds for xe_wait_user_fence_ioctl()
authorPaulo Zanoni <paulo.r.zanoni@intel.com>
Mon, 26 Jun 2023 21:22:21 +0000 (14:22 -0700)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Thu, 21 Dec 2023 16:35:05 +0000 (11:35 -0500)
If !no_engines, then we use copy_from_user to copy to the 'eci' array,
which has XE_HW_ENGINE_MAX_INSTANCE members. The amount of members
copied is given by the user in args->num_engines, so add code to check
that args->num_engines does not exceed XE_HW_ENGINE_MAX_INSTANCE. It's
an unsigned value so there's no need to check for negative values.

Fixes error messages such as:

    Buffer overflow detected (54 < 18446744073709551520)!

Reviewed-by: José Roberto de Souza <jose.souza@intel.com>
Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
Reviewed-by: Lucas De Marchi <lucas.demarchi@intel.com>
Link: https://lore.kernel.org/r/20230626212221.136640-2-paulo.r.zanoni@intel.com
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/xe_wait_user_fence.c

index 3122374341d6aaa5ba7bb436217715e4b25cbf9e..098e2a4cff3fb7eb6ddb36bad4cb4637c710ef31 100644 (file)
@@ -121,6 +121,9 @@ int xe_wait_user_fence_ioctl(struct drm_device *dev, void *data,
                         addr & 0x7))
                return -EINVAL;
 
+       if (XE_IOCTL_ERR(xe, args->num_engines > XE_HW_ENGINE_MAX_INSTANCE))
+               return -EINVAL;
+
        if (!no_engines) {
                err = copy_from_user(eci, user_eci,
                                     sizeof(struct drm_xe_engine_class_instance) *