diff options
author | Frank Binns <[email protected]> | 2015-08-04 14:32:45 +0100 |
---|---|---|
committer | Emil Velikov <[email protected]> | 2015-08-13 17:36:06 +0100 |
commit | 9a4eae61c24858d69d731d63b141d2acaed40d69 (patch) | |
tree | 9225f24c171568b19e06962c9142b7d30c9e41b9 /src/egl/drivers/dri2 | |
parent | 3b491cbc42f6cfad2e750957f720b15b95278acf (diff) |
egl/x11: don't abort when creating a DRI2 drawable fails
When calling either eglCreateWindowSurface or eglCreatePixmapSurface it
was possible for an application to be aborted as a result of it failing
to create a DRI2 drawable on the server. This could happen due to an
application passing in an invalid native drawable handle, for example.
v2: Handle the case where an error has been set on the connection
Cc: <[email protected]>
Signed-off-by: Frank Binns <[email protected]>
Reviewed-by: Emil Velikov <[email protected]>
Diffstat (limited to 'src/egl/drivers/dri2')
-rw-r--r-- | src/egl/drivers/dri2/platform_x11.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/egl/drivers/dri2/platform_x11.c b/src/egl/drivers/dri2/platform_x11.c index 459c3914ad6..bf7d2bea4c1 100644 --- a/src/egl/drivers/dri2/platform_x11.c +++ b/src/egl/drivers/dri2/platform_x11.c @@ -289,7 +289,25 @@ dri2_x11_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type, } if (dri2_dpy->dri2) { - xcb_dri2_create_drawable (dri2_dpy->conn, dri2_surf->drawable); + xcb_void_cookie_t cookie; + int conn_error; + + cookie = xcb_dri2_create_drawable_checked(dri2_dpy->conn, + dri2_surf->drawable); + error = xcb_request_check(dri2_dpy->conn, cookie); + conn_error = xcb_connection_has_error(dri2_dpy->conn); + if (conn_error || error != NULL) { + if (type == EGL_PBUFFER_BIT || conn_error || error->error_code == BadAlloc) + _eglError(EGL_BAD_ALLOC, "xcb_dri2_create_drawable_checked"); + else if (type == EGL_WINDOW_BIT) + _eglError(EGL_BAD_NATIVE_WINDOW, + "xcb_dri2_create_drawable_checked"); + else + _eglError(EGL_BAD_NATIVE_PIXMAP, + "xcb_dri2_create_drawable_checked"); + free(error); + goto cleanup_dri_drawable; + } } else { if (type == EGL_PBUFFER_BIT) { dri2_surf->depth = _eglGetConfigKey(conf, EGL_BUFFER_SIZE); |