glsl: bail out early in _mesa_ShaderSource if no shaderobj

Patch fixes a crash in conformance test that tries out different
invalid arguments for glShaderSource and glGetShaderSource:

   ES2-CTS.gtf.GL.glGetShaderSource.getshadersource_programhandle

This is a regression from commit:
   04e201d0c0

Additions in v2 also fix following failing deqp test:
   dEQP-GLES[2|3].functional.negative_api.shader.shader_source

v2: cleanup function, do check earlier (Iago Toral)

Signed-off-by: Tapani Pälli <tapani.palli@intel.com>
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
This commit is contained in:
Tapani Pälli 2015-09-22 14:34:11 +03:00
parent 10da96887c
commit 89524e7171
1 changed files with 9 additions and 11 deletions

View File

@ -931,13 +931,9 @@ get_shader_source(struct gl_context *ctx, GLuint shader, GLsizei maxLength,
* glShaderSource[ARB].
*/
static void
shader_source(struct gl_context *ctx, GLuint shader, const GLchar *source)
shader_source(struct gl_shader *sh, const GLchar *source)
{
struct gl_shader *sh;
sh = _mesa_lookup_shader_err(ctx, shader, "glShaderSource");
if (!sh)
return;
assert(sh);
/* free old shader source string and install new one */
free((void *)sh->Source);
@ -1639,13 +1635,17 @@ _mesa_ShaderSource(GLhandleARB shaderObj, GLsizei count,
GLint *offsets;
GLsizei i, totalLength;
GLcharARB *source;
struct gl_shader *sh;
#if defined(HAVE_SHA1)
GLcharARB *replacement;
struct gl_shader *sh;
#endif /* HAVE_SHA1 */
if (!shaderObj || string == NULL) {
sh = _mesa_lookup_shader_err(ctx, shaderObj, "glShaderSourceARB");
if (!sh)
return;
if (string == NULL) {
_mesa_error(ctx, GL_INVALID_VALUE, "glShaderSourceARB");
return;
}
@ -1697,8 +1697,6 @@ _mesa_ShaderSource(GLhandleARB shaderObj, GLsizei count,
source[totalLength - 2] = '\0';
#if defined(HAVE_SHA1)
sh = _mesa_lookup_shader(ctx, shaderObj);
/* Dump original shader source to MESA_SHADER_DUMP_PATH and replace
* if corresponding entry found from MESA_SHADER_READ_PATH.
*/
@ -1711,7 +1709,7 @@ _mesa_ShaderSource(GLhandleARB shaderObj, GLsizei count,
}
#endif /* HAVE_SHA1 */
shader_source(ctx, shaderObj, source);
shader_source(sh, source);
free(offsets);
}