glsl: Fix out of bounds read in shader_cache_read_program_metadata
authorKenneth Graunke <kenneth@whitecape.org>
Sat, 8 Jun 2019 06:00:40 +0000 (23:00 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 18 Jun 2019 02:22:19 +0000 (21:22 -0500)
The VaryingNames array has NumVaryings entries.  But BufferStride is
a small array of MAX_FEEDBACK_BUFFERS (4) entries.  Programs with
more than 4 varyings would read out of bounds.

Also, BufferStride is set based on the shader itself, which means that
it's inherently already included in the hash, and doesn't need to be
included again.  At the point when shader_cache_read_program_metadata
is called, the linker hasn't even set those fields yet.  So, just drop
it entirely.

Fixes valgrind errors in KHR-GL45.transform_feedback.linking_errors_test.

Fixes: 6d830940f78 glsl/shader_cache: Allow shader cache usage with transform feedback
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/compiler/glsl/shader_cache.cpp

index 581098b88f0c057c2a6586e4dc1b5e7ce4a819f5..97049043345d490f855a523979d37cc3f84e81b5 100644 (file)
@@ -165,9 +165,8 @@ shader_cache_read_program_metadata(struct gl_context *ctx,
    prog->FragDataIndexBindings->iterate(create_binding_str, &buf);
    ralloc_asprintf_append(&buf, "tf: %d ", prog->TransformFeedback.BufferMode);
    for (unsigned int i = 0; i < prog->TransformFeedback.NumVarying; i++) {
-      ralloc_asprintf_append(&buf, "%s:%d ",
-                             prog->TransformFeedback.VaryingNames[i],
-                             prog->TransformFeedback.BufferStride[i]);
+      ralloc_asprintf_append(&buf, "%s ",
+                             prog->TransformFeedback.VaryingNames[i]);
    }
 
    /* SSO has an effect on the linked program so include this when generating