| From 963b2e8c428f79489ceeb058e8314554ec9cbe6f Mon Sep 17 00:00:00 2001 |
| From: Lucas Stach <l.stach@pengutronix.de> |
| Date: Fri, 24 Feb 2023 18:21:54 +0100 |
| Subject: drm/etnaviv: fix reference leak when mmaping imported buffer |
| |
| From: Lucas Stach <l.stach@pengutronix.de> |
| |
| commit 963b2e8c428f79489ceeb058e8314554ec9cbe6f upstream. |
| |
| drm_gem_prime_mmap() takes a reference on the GEM object, but before that |
| drm_gem_mmap_obj() already takes a reference, which will be leaked as only |
| one reference is dropped when the mapping is closed. Drop the extra |
| reference when dma_buf_mmap() succeeds. |
| |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Lucas Stach <l.stach@pengutronix.de> |
| Reviewed-by: Christian Gmeiner <christian.gmeiner@gmail.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c | 10 +++++++++- |
| 1 file changed, 9 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c |
| +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c |
| @@ -91,7 +91,15 @@ static void *etnaviv_gem_prime_vmap_impl |
| static int etnaviv_gem_prime_mmap_obj(struct etnaviv_gem_object *etnaviv_obj, |
| struct vm_area_struct *vma) |
| { |
| - return dma_buf_mmap(etnaviv_obj->base.dma_buf, vma, 0); |
| + int ret; |
| + |
| + ret = dma_buf_mmap(etnaviv_obj->base.dma_buf, vma, 0); |
| + if (!ret) { |
| + /* Drop the reference acquired by drm_gem_mmap_obj(). */ |
| + drm_gem_object_put(&etnaviv_obj->base); |
| + } |
| + |
| + return ret; |
| } |
| |
| static const struct etnaviv_gem_ops etnaviv_gem_prime_ops = { |