When kzalloc fails for metadata_buffer in
amdgpu_amdkfd_get_dmabuf_info(), the function returns -ENOMEM directly
without calling dma_buf_put(), leaking the dma_buf reference obtained
earlier via dma_buf_get().

Fix both issues by:
- Adding an error check after the first amdgpu_bo_get_metadata() call
- Replacing the direct return with r = -ENOMEM and goto out_put to
  ensure dma_buf_put() is called on all error paths

Fixes: f54ce9e8cbd3 ("drm/amdkfd: Let driver decide buffer size at 
AMDKFD_IOC_GET_DMABUF_INFO ioctl")
Signed-off-by: Haojie Li <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
index 054870e9078d..ca5860e493a6 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
@@ -598,14 +598,18 @@ int amdgpu_amdkfd_get_dmabuf_info(struct amdgpu_device 
*adev, int dma_buf_fd,
                /* first get metadata_size by buffer = NULL */
                r = amdgpu_bo_get_metadata(bo, NULL, 0,
                                           metadata_size, NULL);
+               if (r)
+                       goto out_put;
 
                /* user buf_size is bigger than bo metadata_size
                 * allocate a buf at kernel space and copy */
                if (*metadata_size <= buffer_size) {
                        *metadata_buffer = kzalloc(*metadata_size, GFP_KERNEL);
 
-                       if (!*metadata_buffer)
-                               return -ENOMEM;
+                       if (!*metadata_buffer) {
+                               r = -ENOMEM;
+                               goto out_put;
+                       }
 
                        r = amdgpu_bo_get_metadata(bo, *metadata_buffer, 
*metadata_size,
                                                   NULL, &metadata_flags);
-- 
2.25.1

Reply via email to