On 1/10/24 12:03, Zack Rusin wrote:
> vmw_context_cotable can return either an error or a null pointer and its
> usage sometimes went unchecked. Subsequent code would then try to access
> either a null pointer or an error value.
> 
> The invalid dereferences were only possible with malformed userspace
> apps which never properly initialized the rendering contexts.
> 
> Check the results of vmw_context_cotable to fix the invalid derefs.
> 
> Thanks:
> ziming zhang(@ezrak1e) from Ant Group Light-Year Security Lab
> who was the first person to discover it.
> Niels De Graef who reported it and helped to track down the poc.
> 
> Fixes: 9c079b8ce8bf ("drm/vmwgfx: Adapt execbuf to the new validation api")
> Cc: <sta...@vger.kernel.org> # v4.20+
> Reported-by: Niels De Graef  <ndegr...@redhat.com>
> Signed-off-by: Zack Rusin <zack.ru...@broadcom.com>
> Cc: Martin Krastev <martin.kras...@broadcom.com>
> Cc: Maaz Mombasawala <maaz.mombasaw...@broadcom.com>
> Cc: Ian Forbes <ian.for...@broadcom.com>
> Cc: Broadcom internal kernel review list 
> <bcm-kernel-feedback-l...@broadcom.com>
> Cc: dri-devel@lists.freedesktop.org
> ---
>  drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | 14 +++++++++++---
>  1 file changed, 11 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c 
> b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
> index 272141b6164c..4f09959d27ba 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
> @@ -447,7 +447,7 @@ static int vmw_resource_context_res_add(struct 
> vmw_private *dev_priv,
>           vmw_res_type(ctx) == vmw_res_dx_context) {
>               for (i = 0; i < cotable_max; ++i) {
>                       res = vmw_context_cotable(ctx, i);
> -                     if (IS_ERR(res))
> +                     if (IS_ERR_OR_NULL(res))
>                               continue;
>  
>                       ret = vmw_execbuf_res_val_add(sw_context, res,
> @@ -1266,6 +1266,8 @@ static int vmw_cmd_dx_define_query(struct vmw_private 
> *dev_priv,
>               return -EINVAL;
>  
>       cotable_res = vmw_context_cotable(ctx_node->ctx, SVGA_COTABLE_DXQUERY);
> +     if (IS_ERR_OR_NULL(cotable_res))
> +             return cotable_res ? PTR_ERR(cotable_res) : -EINVAL;
>       ret = vmw_cotable_notify(cotable_res, cmd->body.queryId);
>  
>       return ret;
> @@ -2484,6 +2486,8 @@ static int vmw_cmd_dx_view_define(struct vmw_private 
> *dev_priv,
>               return ret;
>  
>       res = vmw_context_cotable(ctx_node->ctx, vmw_view_cotables[view_type]);
> +     if (IS_ERR_OR_NULL(res))
> +             return res ? PTR_ERR(res) : -EINVAL;
>       ret = vmw_cotable_notify(res, cmd->defined_id);
>       if (unlikely(ret != 0))
>               return ret;
> @@ -2569,8 +2573,8 @@ static int vmw_cmd_dx_so_define(struct vmw_private 
> *dev_priv,
>  
>       so_type = vmw_so_cmd_to_type(header->id);
>       res = vmw_context_cotable(ctx_node->ctx, vmw_so_cotables[so_type]);
> -     if (IS_ERR(res))
> -             return PTR_ERR(res);
> +     if (IS_ERR_OR_NULL(res))
> +             return res ? PTR_ERR(res) : -EINVAL;
>       cmd = container_of(header, typeof(*cmd), header);
>       ret = vmw_cotable_notify(res, cmd->defined_id);
>  
> @@ -2689,6 +2693,8 @@ static int vmw_cmd_dx_define_shader(struct vmw_private 
> *dev_priv,
>               return -EINVAL;
>  
>       res = vmw_context_cotable(ctx_node->ctx, SVGA_COTABLE_DXSHADER);
> +     if (IS_ERR_OR_NULL(res))
> +             return res ? PTR_ERR(res) : -EINVAL;
>       ret = vmw_cotable_notify(res, cmd->body.shaderId);
>       if (ret)
>               return ret;
> @@ -3010,6 +3016,8 @@ static int vmw_cmd_dx_define_streamoutput(struct 
> vmw_private *dev_priv,
>       }
>  
>       res = vmw_context_cotable(ctx_node->ctx, SVGA_COTABLE_STREAMOUTPUT);
> +     if (IS_ERR_OR_NULL(res))
> +             return res ? PTR_ERR(res) : -EINVAL;
>       ret = vmw_cotable_notify(res, cmd->body.soid);
>       if (ret)
>               return ret;

LGTM!

Reviewed-by: Maaz Mombasawala <maaz.mombasaw...@broadcom.com>

Thanks,

Maaz Mombasawala <maaz.mombasaw...@broadcom.com>

Reply via email to