summaryrefslogtreecommitdiffstats
path: root/src/egl/drivers/dri2/platform_drm.c
diff options
context:
space:
mode:
authorMatt Turner <mattst88@gmail.com>2015-07-15 09:00:41 -0700
committerEmil Velikov <emil.l.velikov@gmail.com>2015-09-15 12:37:26 +0100
commite4f0d26c8c3c092a09fb65184ab080de4e38373e (patch)
tree1425a07328440c46df26553dee551a7cf336915a /src/egl/drivers/dri2/platform_drm.c
parent4bf151e66279da00655cec02aadb52c9c6583213 (diff)
downloadexternal_mesa3d-e4f0d26c8c3c092a09fb65184ab080de4e38373e.zip
external_mesa3d-e4f0d26c8c3c092a09fb65184ab080de4e38373e.tar.gz
external_mesa3d-e4f0d26c8c3c092a09fb65184ab080de4e38373e.tar.bz2
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 <emil.l.velikov@gmail.com> Reviewed-by: Boyan Ding <boyan.j.ding@gmail.com>
Diffstat (limited to 'src/egl/drivers/dri2/platform_drm.c')
-rw-r--r--src/egl/drivers/dri2/platform_drm.c27
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 eda5087..7e97280 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;
}