OSDN Git Service

exynos: fix leak on error path of gbm_exynos_bo_create
authorZach Reizner <zachr@google.com>
Tue, 3 May 2016 22:45:16 +0000 (15:45 -0700)
committerchrome-bot <chrome-bot@chromium.org>
Sat, 7 May 2016 10:32:48 +0000 (03:32 -0700)
BUG=None
TEST=None

Change-Id: Ib536047b3a7ec70f31b4065c041cc4cafa32002f
Reviewed-on: https://chromium-review.googlesource.com/342147
Commit-Ready: Zach Reizner <zachr@chromium.org>
Tested-by: Zach Reizner <zachr@chromium.org>
Reviewed-by: Zach Reizner <zachr@chromium.org>
exynos.c

index 79e7e2f..4c9bfa5 100644 (file)
--- a/exynos.c
+++ b/exynos.c
@@ -45,10 +45,10 @@ static int gbm_exynos_bo_create(struct gbm_bo *bo,
                return -EINVAL;
        }
 
+       int ret;
        for (plane = 0; plane < bo->num_planes; plane++) {
                size_t size = bo->sizes[plane];
                struct drm_exynos_gem_create gem_create;
-               int ret;
 
                memset(&gem_create, 0, sizeof(gem_create));
                gem_create.size = size;
@@ -58,13 +58,29 @@ static int gbm_exynos_bo_create(struct gbm_bo *bo,
                if (ret) {
                        fprintf(stderr, "minigbm: DRM_IOCTL_EXYNOS_GEM_CREATE failed "
                                        "(size=%zu)\n", size);
-                       return ret;
+                       goto cleanup_planes;
                }
 
                bo->handles[plane].u32 = gem_create.handle;
        }
 
        return 0;
+
+cleanup_planes:
+       for ( ; plane != 0; plane--) {
+               struct drm_gem_close gem_close;
+               memset(&gem_close, 0, sizeof(gem_close));
+               gem_close.handle = bo->handles[plane - 1].u32;
+               int gem_close_ret = drmIoctl(bo->gbm->fd, DRM_IOCTL_GEM_CLOSE,
+                                            &gem_close);
+               if (gem_close_ret) {
+                       fprintf(stderr,
+                               "minigbm: DRM_IOCTL_GEM_CLOSE failed: %d\n",
+                               gem_close_ret);
+               }
+       }
+
+       return ret;
 }
 
 const struct gbm_driver gbm_driver_exynos =