Close release_fence_fd when wl_egl_buffer freed. 15/255915/1
authorJoonbum Ko <joonbum.ko@samsung.com>
Thu, 25 Mar 2021 03:46:10 +0000 (12:46 +0900)
committerJoonbum Ko <joonbum.ko@samsung.com>
Thu, 25 Mar 2021 03:46:12 +0000 (12:46 +0900)
 - The fenced_release event can be dispatched just before
  the wl_egl_buffer is freed.
   At this time, release_fence_fd delivered to fenced_release event
  may leak if it is not closed because wl_egl_buffer cannot be
  used and is freed.

Change-Id: I7584c518b955c83f632b2d5ea281272f8dd2b166
Signed-off-by: Joonbum Ko <joonbum.ko@samsung.com>
src/tpl_wl_egl_thread.c

index 61477168976b8136135d2af2c69acc33062ae0ba..41bc081388f0ed716b33c1412414ba98de16b69f 100755 (executable)
@@ -2353,6 +2353,8 @@ __tpl_wl_egl_surface_dequeue_buffer(tpl_surface_t *surface, uint64_t timeout_ns,
                        *release_fence = wl_egl_buffer->release_fence_fd;
                        TPL_DEBUG("wl_egl_surface(%p) wl_egl_buffer(%p) release_fence_fd(%d)",
                                          wl_egl_surface, wl_egl_buffer, *release_fence);
+
+                       wl_egl_buffer->release_fence_fd = -1;
                } else {
                        *release_fence = -1;
                }
@@ -3286,6 +3288,11 @@ __cb_wl_egl_buffer_free(tpl_wl_egl_buffer_t *wl_egl_buffer)
                wl_egl_buffer->buffer_release = NULL;
        }
 
+       if (wl_egl_buffer->release_fence_fd != -1) {
+               close(wl_egl_buffer->release_fence_fd);
+               wl_egl_buffer->release_fence_fd = -1;
+       }
+
        if (wl_egl_buffer->waiting_source) {
                tpl_gsource_destroy(wl_egl_buffer->waiting_source, TPL_FALSE);
                wl_egl_buffer->waiting_source = NULL;