diff options
author | Matt Turner <[email protected]> | 2015-07-15 09:00:41 -0700 |
---|---|---|
committer | Emil Velikov <[email protected]> | 2015-09-15 12:37:26 +0100 |
commit | e4f0d26c8c3c092a09fb65184ab080de4e38373e (patch) | |
tree | 1425a07328440c46df26553dee551a7cf336915a /src/egl/drivers | |
parent | 4bf151e66279da00655cec02aadb52c9c6583213 (diff) |
egl/dri2: Close file descriptor on error.
v2: [Emil Velikov]
Rework the error path to a common goto, close only if we own the fd.
v3; [Emil Velikov]
Always close the fd (we either opened the device or dup'd) (Boyan, Ian)
Signed-off-by: Emil Velikov <[email protected]>
Reviewed-by: Boyan Ding <[email protected]>
Diffstat (limited to 'src/egl/drivers')
-rw-r--r-- | src/egl/drivers/dri2/platform_drm.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/src/egl/drivers/dri2/platform_drm.c b/src/egl/drivers/dri2/platform_drm.c index eda50875e02..7e972804608 100644 --- a/src/egl/drivers/dri2/platform_drm.c +++ b/src/egl/drivers/dri2/platform_drm.c @@ -623,26 +623,20 @@ dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp) dri2_dpy->own_device = 1; gbm = gbm_create_device(fd); if (gbm == NULL) - return EGL_FALSE; + goto cleanup; } - if (strcmp(gbm_device_get_backend_name(gbm), "drm") != 0) { - free(dri2_dpy); - return EGL_FALSE; - } + if (strcmp(gbm_device_get_backend_name(gbm), "drm") != 0) + goto cleanup; dri2_dpy->gbm_dri = gbm_dri_device(gbm); - if (dri2_dpy->gbm_dri->base.type != GBM_DRM_DRIVER_TYPE_DRI) { - free(dri2_dpy); - return EGL_FALSE; - } + if (dri2_dpy->gbm_dri->base.type != GBM_DRM_DRIVER_TYPE_DRI) + goto cleanup; if (fd < 0) { fd = fcntl(gbm_device_get_fd(gbm), F_DUPFD_CLOEXEC, 3); - if (fd < 0) { - free(dri2_dpy); - return EGL_FALSE; - } + if (fd < 0) + goto cleanup; } dri2_dpy->fd = fd; @@ -727,4 +721,11 @@ dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp) dri2_dpy->vtbl = &dri2_drm_display_vtbl; return EGL_TRUE; + +cleanup: + if (fd >= 0) + close(fd); + + free(dri2_dpy); + return EGL_FALSE; } |