From 0bcaa07af26c3748fe4f838f69f2234b047bdb25 Mon Sep 17 00:00:00 2001 From: Prakash Kamliya Date: Thu, 25 May 2017 19:48:44 +0530 Subject: drm/msm: fix leak in failed get_pages get_pages doesn't keep a reference of the pages allocated when it fails later in the code path. This can lead to a memory leak. Keep reference of the allocated pages so that it can be freed when msm_gem_free_object gets called later during cleanup. Change-Id: I44dea20e10c056c1c5e80d01bab0a274ff768b1c Signed-off-by: Prakash Kamliya --- drivers/gpu/drm/msm/msm_gem.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'drivers/gpu') diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index 4bee797da746..8f2a0eea4c4e 100644 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c @@ -113,13 +113,15 @@ static struct page **get_pages(struct drm_gem_object *obj) return p; } + msm_obj->pages = p; + msm_obj->sgt = drm_prime_pages_to_sg(p, npages); if (IS_ERR(msm_obj->sgt)) { - dev_err(dev->dev, "failed to allocate sgt\n"); - return ERR_CAST(msm_obj->sgt); - } + void *ptr = ERR_CAST(msm_obj->sgt); - msm_obj->pages = p; + msm_obj->sgt = NULL; + return ptr; + } /* * Make sure to flush the CPU cache for newly allocated memory @@ -157,7 +159,8 @@ static void put_pages(struct drm_gem_object *obj) msm_obj->flags &= ~MSM_BO_LOCKED; } - sg_free_table(msm_obj->sgt); + if (msm_obj->sgt) + sg_free_table(msm_obj->sgt); kfree(msm_obj->sgt); if (use_pages(obj)) { -- cgit v1.2.3