dispatch: Load EGL/GLX provider lib from epoxy_has_{egl,glx}()

Now that we're being conservative about probing libraries, these
entrypoints would not succeed unless the caller had already dlopened
stuff themselves, or had explicitly linked against the provider library.
Both of those are exactly not what we want.

Signed-off-by: Adam Jackson <ajax@redhat.com>
macos/v1.5.9
Adam Jackson 7 years ago
parent 53ae0bbffe
commit 90db0069b4
  1. 36
      src/dispatch_common.c
  2. 3
      src/dispatch_common.h
  3. 10
      src/dispatch_egl.c
  4. 14
      src/dispatch_glx.c

@ -292,7 +292,7 @@ library_init(void)
}
static bool
get_dlopen_handle(void **handle, const char *lib_name, bool exit_on_fail)
get_dlopen_handle(void **handle, const char *lib_name, bool exit_on_fail, bool load)
{
if (*handle)
return true;
@ -308,7 +308,7 @@ get_dlopen_handle(void **handle, const char *lib_name, bool exit_on_fail)
pthread_mutex_lock(&api.mutex);
if (!*handle) {
int flags = RTLD_LAZY | RTLD_LOCAL;
if (!exit_on_fail)
if (!load)
flags |= RTLD_NOLOAD;
*handle = dlopen(lib_name, flags);
@ -550,16 +550,16 @@ epoxy_internal_has_gl_extension(const char *ext, bool invalid_op_mode)
}
}
static bool
epoxy_load_glx(bool exit_if_fails)
bool
epoxy_load_glx(bool exit_if_fails, bool load)
{
#ifdef GLVND_GLX_LIB
/* prefer the glvnd library if it exists */
if (!api.glx_handle)
get_dlopen_handle(&api.glx_handle, GLVND_GLX_LIB, false);
get_dlopen_handle(&api.glx_handle, GLVND_GLX_LIB, false, load);
#endif
if (!api.glx_handle)
get_dlopen_handle(&api.glx_handle, GLX_LIB, exit_if_fails);
get_dlopen_handle(&api.glx_handle, GLX_LIB, exit_if_fails, load);
return api.glx_handle != NULL;
}
@ -567,7 +567,7 @@ epoxy_load_glx(bool exit_if_fails)
void *
epoxy_conservative_glx_dlsym(const char *name, bool exit_if_fails)
{
if (epoxy_load_glx(exit_if_fails))
if (epoxy_load_glx(exit_if_fails, exit_if_fails))
return do_dlsym(&api.glx_handle, name, exit_if_fails);
return NULL;
@ -633,16 +633,16 @@ epoxy_conservative_has_gl_extension(const char *ext)
return epoxy_internal_has_gl_extension(ext, true);
}
static bool
epoxy_load_egl(bool exit_if_fails)
bool
epoxy_load_egl(bool exit_if_fails, bool load)
{
return get_dlopen_handle(&api.egl_handle, EGL_LIB, exit_if_fails);
return get_dlopen_handle(&api.egl_handle, EGL_LIB, exit_if_fails, load);
}
void *
epoxy_conservative_egl_dlsym(const char *name, bool exit_if_fails)
{
if (epoxy_load_egl(exit_if_fails))
if (epoxy_load_egl(exit_if_fails, exit_if_fails))
return do_dlsym(&api.egl_handle, name, exit_if_fails);
return NULL;
@ -667,15 +667,15 @@ epoxy_load_gl(void)
return;
#if defined(_WIN32) || defined(__APPLE__)
get_dlopen_handle(&api.gl_handle, OPENGL_LIB, true);
get_dlopen_handle(&api.gl_handle, OPENGL_LIB, true, true);
#else
#if defined(OPENGL_LIB)
if (!api.gl_handle)
get_dlopen_handle(&api.gl_handle, OPENGL_LIB, false);
get_dlopen_handle(&api.gl_handle, OPENGL_LIB, false, true);
#endif
get_dlopen_handle(&api.glx_handle, GLX_LIB, true);
get_dlopen_handle(&api.glx_handle, GLX_LIB, true, true);
api.gl_handle = api.glx_handle;
#endif
}
@ -694,7 +694,7 @@ epoxy_gles1_dlsym(const char *name)
if (epoxy_current_context_is_glx()) {
return epoxy_get_proc_address(name);
} else {
get_dlopen_handle(&api.gles1_handle, GLES1_LIB, true);
get_dlopen_handle(&api.gles1_handle, GLES1_LIB, true, true);
return do_dlsym(&api.gles1_handle, name, true);
}
}
@ -705,7 +705,7 @@ epoxy_gles2_dlsym(const char *name)
if (epoxy_current_context_is_glx()) {
return epoxy_get_proc_address(name);
} else {
get_dlopen_handle(&api.gles2_handle, GLES2_LIB, true);
get_dlopen_handle(&api.gles2_handle, GLES2_LIB, true, true);
return do_dlsym(&api.gles2_handle, name, true);
}
}
@ -726,7 +726,7 @@ epoxy_gles3_dlsym(const char *name)
if (epoxy_current_context_is_glx()) {
return epoxy_get_proc_address(name);
} else {
if (get_dlopen_handle(&api.gles2_handle, GLES2_LIB, false)) {
if (get_dlopen_handle(&api.gles2_handle, GLES2_LIB, false, true)) {
void *func = do_dlsym(&api.gles2_handle, GLES2_LIB, false);
if (func)
@ -806,7 +806,7 @@ epoxy_get_bootstrap_proc_address(const char *name)
* non-X11 ES2 context from loading a bunch of X11 junk).
*/
#if PLATFORM_HAS_EGL
get_dlopen_handle(&api.egl_handle, EGL_LIB, false);
get_dlopen_handle(&api.egl_handle, EGL_LIB, false, true);
if (api.egl_handle) {
int version = 0;
switch (epoxy_egl_get_current_gl_context_api()) {

@ -172,6 +172,9 @@ bool epoxy_conservative_has_wgl_extension(const char *name);
void *epoxy_conservative_egl_dlsym(const char *name, bool exit_if_fails);
void *epoxy_conservative_glx_dlsym(const char *name, bool exit_if_fails);
bool epoxy_load_glx(bool exit_if_fails, bool load);
bool epoxy_load_egl(bool exit_if_fails, bool load);
#define glBegin_unwrapped epoxy_glBegin_unwrapped
#define glEnd_unwrapped epoxy_glEnd_unwrapped
extern void UNWRAPPED_PROTO(glBegin_unwrapped)(GLenum primtype);

@ -109,11 +109,13 @@ epoxy_has_egl(void)
#if !PLATFORM_HAS_EGL
return false;
#else
EGLDisplay* (* pf_eglGetCurrentDisplay) (void);
if (epoxy_load_egl(false, true)) {
EGLDisplay* (* pf_eglGetCurrentDisplay) (void);
pf_eglGetCurrentDisplay = epoxy_conservative_egl_dlsym("eglGetCurrentDisplay", false);
if (pf_eglGetCurrentDisplay)
return true;
pf_eglGetCurrentDisplay = epoxy_conservative_egl_dlsym("eglGetCurrentDisplay", false);
if (pf_eglGetCurrentDisplay)
return true;
}
return false;
#endif /* PLATFORM_HAS_EGL */

@ -158,12 +158,14 @@ epoxy_has_glx(Display *dpy)
#if !PLATFORM_HAS_GLX
return false;
#else
Bool (* pf_glXQueryExtension) (Display *, int *, int *);
int error_base, event_base;
pf_glXQueryExtension = epoxy_conservative_glx_dlsym("glXQueryExtension", false);
if (pf_glXQueryExtension && pf_glXQueryExtension(dpy, &error_base, &event_base))
return true;
if (epoxy_load_glx(false, true)) {
Bool (* pf_glXQueryExtension) (Display *, int *, int *);
int error_base, event_base;
pf_glXQueryExtension = epoxy_conservative_glx_dlsym("glXQueryExtension", false);
if (pf_glXQueryExtension && pf_glXQueryExtension(dpy, &error_base, &event_base))
return true;
}
return false;
#endif /* !PLATFORM_HAS_GLX */

Loading…
Cancel
Save