In desktop GL, glGetString(GL_SHADING_LANGUAGE_VERSION) returns a string that begins with the supported version number. But in GLES, the version number is preceded by the text "OpenGL ES GLSL ES ". This was causing glslparsertest to fail to parse the implementation's supported GLSL version, and that in turn caused parse_glsl_version() function to access uninitialized memory.
This patch splits parse_glsl_version() into two functions: parse_glsl_version_number(), which parses the bare version number, and parse_glsl_version_string(), which expects the prefix "OpenGL ES GLSL ES " when compiled for GLES testing. --- tests/glslparsertest/glslparsertest.c | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/tests/glslparsertest/glslparsertest.c b/tests/glslparsertest/glslparsertest.c index 1fd75d1..26a558f 100644 --- a/tests/glslparsertest/glslparsertest.c +++ b/tests/glslparsertest/glslparsertest.c @@ -35,12 +35,13 @@ #include "piglit-util-gl-common.h" -static unsigned parse_glsl_version(const char *str); +static unsigned parse_glsl_version_number(const char *str); PIGLIT_GL_TEST_CONFIG_BEGIN if (argc > 3) { - const unsigned int int_version = parse_glsl_version(argv[3]); + const unsigned int int_version + = parse_glsl_version_number(argv[3]); switch (int_version) { case 100: config.supports_gl_compat_version = 10; @@ -336,7 +337,7 @@ int process_options(int argc, char **argv) } static unsigned -parse_glsl_version(const char *str) +parse_glsl_version_number(const char *str) { unsigned major; unsigned minor; @@ -345,6 +346,26 @@ parse_glsl_version(const char *str) return (major * 100) + minor; } + +static unsigned +parse_glsl_version_string(const char *str) +{ +#if defined(PIGLIT_USE_OPENGL_ES2) || defined(PIGLIT_USE_OPENGL_ES3) + /* In GLSL ES, the string returned by + * glGetString(GL_SHADING_LANGUAGE_VERSION) is prefixed by + * some text. Verify that the expected text is there and skip + * it before calling parse_glsl_version_number(). + */ + const char *expected_prefix = "OpenGL ES GLSL ES "; + if (strncmp(str, expected_prefix, strlen(expected_prefix)) != 0) { + printf("Ill-formed GLSL version string: %s\n", str); + piglit_report_result(PIGLIT_FAIL); + } + str += strlen(expected_prefix); +#endif + return parse_glsl_version_number(str); +} + void piglit_init(int argc, char**argv) { @@ -368,7 +389,7 @@ piglit_init(int argc, char**argv) usage(argv[0]); if (argc > 3) - requested_version = parse_glsl_version(argv[3]); + requested_version = parse_glsl_version_number(argv[3]); gl_version_times_10 = piglit_get_gl_version(); @@ -383,7 +404,7 @@ piglit_init(int argc, char**argv) glGetString(GL_SHADING_LANGUAGE_VERSION); if (glsl_version_string != NULL) - glsl_version = parse_glsl_version(glsl_version_string); + glsl_version = parse_glsl_version_string(glsl_version_string); if (requested_version == 100) { piglit_require_extension("GL_ARB_ES2_compatibility"); -- 1.8.1.4 _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/piglit