[PATCH] drm/v3d: Fix memory leak in v3d_submit_cl_ioctl

Daniel Vetter daniel at ffwll.ch
Tue Oct 22 09:36:54 UTC 2019


On Mon, Oct 21, 2019 at 01:52:49PM -0500, Navid Emamdoost wrote:
> In the impelementation of v3d_submit_cl_ioctl() there are two memory
> leaks. One is when allocation for bin fails, and the other is when bin
> initialization fails. If kcalloc fails to allocate memory for bin then
> render->base should be put. Also, if v3d_job_init() fails to initialize
> bin->base then allocated memory for bin should be released.
> 
> Fixes: a783a09ee76d ("drm/v3d: Refactor job management.")
> Signed-off-by: Navid Emamdoost <navid.emamdoost at gmail.com>
> ---
>  drivers/gpu/drm/v3d/v3d_gem.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/v3d/v3d_gem.c b/drivers/gpu/drm/v3d/v3d_gem.c
> index 5d80507b539b..19c092d75266 100644
> --- a/drivers/gpu/drm/v3d/v3d_gem.c
> +++ b/drivers/gpu/drm/v3d/v3d_gem.c
> @@ -557,13 +557,16 @@ v3d_submit_cl_ioctl(struct drm_device *dev, void *data,
>  
>  	if (args->bcl_start != args->bcl_end) {
>  		bin = kcalloc(1, sizeof(*bin), GFP_KERNEL);
> -		if (!bin)
> +		if (!bin) {
> +			v3d_job_put(&render->base);

The job isn't initialized yet, this doesn't work.

>  			return -ENOMEM;
> +		}
>  
>  		ret = v3d_job_init(v3d, file_priv, &bin->base,
>  				   v3d_job_free, args->in_sync_bcl);
>  		if (ret) {
>  			v3d_job_put(&render->base);

v3d_job_put will call kfree, if you chase the callchain long enough (in
v3d_job_free). So no bug here, this would lead to a double kfree and
crash.
-Daniel

> +			kfree(bin);
>  			return ret;
>  		}
>  
> -- 
> 2.17.1
> 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


More information about the dri-devel mailing list