From c513bd330d06c7e57ca294f5e3cf7f0824afefc4 Mon Sep 17 00:00:00 2001 From: "Miguel A. Vico" Date: Mon, 21 Mar 2016 17:37:33 +0100 Subject: [PATCH 3/7] gl-renderer: Implement & use check_extension X-NVConfidentiality: public Using strstr(3) for checking for extensions is an error-prone mechanism as extension names can be prefixes of other extension names (see https://www.opengl.org/registry/doc/rules.html#using). This change implements the check_extension() function to properly check for an extension and replaces all usages of strstr(3). Signed-off-by: Miguel A Vico Moya Reviewed-by: Andy Ritger Reviewed-by: Daniel Stone [Pekka: move 'bool' to the same line with 'static'] Signed-off-by: Pekka Paalanen (cherry picked from commit cc3a192b448153a7911d44aa0fa549099607911d) --- src/gl-renderer.c | 56 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/src/gl-renderer.c b/src/gl-renderer.c index 1d6d98c9b86b..887d131674f5 100644 --- a/src/gl-renderer.c +++ b/src/gl-renderer.c @@ -2701,6 +2701,34 @@ gl_renderer_destroy(struct weston_compositor *ec) free(gr); } +static bool +check_extension(const char *extensions, const char *extension) +{ + size_t extlen = strlen(extension); + const char *end = extensions + strlen(extensions); + + while (extensions < end) { + size_t n = 0; + + /* Skip whitespaces, if any */ + if (*extensions == ' ') { + extensions++; + continue; + } + + n = strcspn(extensions, " "); + + /* Compare strings */ + if (n == extlen && strncmp(extension, extensions, n) == 0) + return true; /* Found */ + + extensions += n; + } + + /* Not found */ + return false; +} + static void renderer_setup_egl_client_extensions(struct gl_renderer *gr) { @@ -2712,7 +2740,7 @@ renderer_setup_egl_client_extensions(struct gl_renderer *gr) return; } - if (strstr(extensions, "EGL_EXT_platform_base")) + if (check_extension(extensions, "EGL_EXT_platform_base")) gr->create_platform_window = (void *) eglGetProcAddress("eglCreatePlatformWindowSurfaceEXT"); else @@ -2742,7 +2770,7 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec) return -1; } - if (strstr(extensions, "EGL_WL_bind_wayland_display")) + if (check_extension(extensions, "EGL_WL_bind_wayland_display")) gr->has_bind_display = 1; if (gr->has_bind_display) { ret = gr->bind_display(gr->egl_display, ec->wl_display); @@ -2750,14 +2778,14 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec) gr->has_bind_display = 0; } - if (strstr(extensions, "EGL_EXT_buffer_age")) + if (check_extension(extensions, "EGL_EXT_buffer_age")) gr->has_egl_buffer_age = 1; else weston_log("warning: EGL_EXT_buffer_age not supported. " "Performance could be affected.\n"); #ifdef EGL_EXT_swap_buffers_with_damage - if (strstr(extensions, "EGL_EXT_swap_buffers_with_damage")) + if (check_extension(extensions, "EGL_EXT_swap_buffers_with_damage")) gr->swap_buffers_with_damage = (void *) eglGetProcAddress("eglSwapBuffersWithDamageEXT"); else @@ -2766,12 +2794,12 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec) #endif #ifdef EGL_MESA_configless_context - if (strstr(extensions, "EGL_MESA_configless_context")) + if (check_extension(extensions, "EGL_MESA_configless_context")) gr->has_configless_context = 1; #endif #ifdef EGL_EXT_image_dma_buf_import - if (strstr(extensions, "EGL_EXT_image_dma_buf_import")) + if (check_extension(extensions, "EGL_EXT_image_dma_buf_import")) gr->has_dmabuf_import = 1; #endif @@ -2840,19 +2868,19 @@ gl_renderer_supports(struct weston_compositor *ec, extensions); } - if (!strstr(extensions, "EGL_EXT_platform_base")) + if (!check_extension(extensions, "EGL_EXT_platform_base")) return 0; snprintf(s, sizeof s, "EGL_KHR_platform_%s", extension_suffix); - if (strstr(extensions, s)) + if (check_extension(extensions, s)) return 1; snprintf(s, sizeof s, "EGL_EXT_platform_%s", extension_suffix); - if (strstr(extensions, s)) + if (check_extension(extensions, s)) return 1; snprintf(s, sizeof s, "EGL_MESA_platform_%s", extension_suffix); - if (strstr(extensions, s)) + if (check_extension(extensions, s)) return 1; /* at this point we definitely have some platform extensions but @@ -3104,22 +3132,22 @@ gl_renderer_setup(struct weston_compositor *ec, EGLSurface egl_surface) return -1; } - if (!strstr(extensions, "GL_EXT_texture_format_BGRA8888")) { + if (!check_extension(extensions, "GL_EXT_texture_format_BGRA8888")) { weston_log("GL_EXT_texture_format_BGRA8888 not available\n"); return -1; } - if (strstr(extensions, "GL_EXT_read_format_bgra")) + if (check_extension(extensions, "GL_EXT_read_format_bgra")) ec->read_format = PIXMAN_a8r8g8b8; else ec->read_format = PIXMAN_a8b8g8r8; #ifdef GL_EXT_unpack_subimage - if (strstr(extensions, "GL_EXT_unpack_subimage")) + if (check_extension(extensions, "GL_EXT_unpack_subimage")) gr->has_unpack_subimage = 1; #endif - if (strstr(extensions, "GL_OES_EGL_image_external")) + if (check_extension(extensions, "GL_OES_EGL_image_external")) gr->has_egl_image_external = 1; glActiveTexture(GL_TEXTURE0); -- 2.7.4