Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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.

Signed-off-by: Prakash Kamliya <pkamliya@codeaurora.org>
Signed-off-by: Sharat Masetty <smasetty@codeaurora.org>
Signed-off-by: Rob Clark <robdclark@gmail.com>

authored by

Prakash Kamliya and committed by
Rob Clark
62e3a3e3 a1ed6def

+11 -5
+11 -5
drivers/gpu/drm/msm/msm_gem.c
··· 93 93 return p; 94 94 } 95 95 96 + msm_obj->pages = p; 97 + 96 98 msm_obj->sgt = drm_prime_pages_to_sg(p, npages); 97 99 if (IS_ERR(msm_obj->sgt)) { 98 - dev_err(dev->dev, "failed to allocate sgt\n"); 99 - return ERR_CAST(msm_obj->sgt); 100 - } 100 + void *ptr = ERR_CAST(msm_obj->sgt); 101 101 102 - msm_obj->pages = p; 102 + dev_err(dev->dev, "failed to allocate sgt\n"); 103 + msm_obj->sgt = NULL; 104 + return ptr; 105 + } 103 106 104 107 /* For non-cached buffers, ensure the new pages are clean 105 108 * because display controller, GPU, etc. are not coherent: ··· 138 135 if (msm_obj->flags & (MSM_BO_WC|MSM_BO_UNCACHED)) 139 136 dma_unmap_sg(obj->dev->dev, msm_obj->sgt->sgl, 140 137 msm_obj->sgt->nents, DMA_BIDIRECTIONAL); 141 - sg_free_table(msm_obj->sgt); 138 + 139 + if (msm_obj->sgt) 140 + sg_free_table(msm_obj->sgt); 141 + 142 142 kfree(msm_obj->sgt); 143 143 144 144 if (use_pages(obj))