glsl: on UBO/SSBOs link error reset the number of active blocks to 0
authorAndres Gomez <agomez@igalia.com>
Wed, 22 Feb 2017 15:03:22 +0000 (17:03 +0200)
committerAndres Gomez <agomez@igalia.com>
Mon, 27 Mar 2017 09:45:59 +0000 (12:45 +0300)
While it's legal to have an active blocks count > 0 on link failure.
Unless we actually assign memory for the blocks array we can end up
segfaulting in calls such as glUniformBlockBinding().

To avoid having to NULL check these api calls we simply reset the
block count to 0 if the array was not created.

Signed-off-by: Andres Gomez <agomez@igalia.com>
Cc: Timothy Arceri <tarceri@itsqueeze.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/compiler/glsl/linker.cpp

index 3eddbe24d0908efd2fcd09fa42885814ba2bfee1..f9c226a22c6978ae97cc3c18166251b3e07df0de 100644 (file)
@@ -1181,6 +1181,12 @@ interstage_cross_validate_uniform_blocks(struct gl_shader_program *prog,
             for (unsigned k = 0; k <= i; k++) {
                delete[] InterfaceBlockStageIndex[k];
             }
+
+            /* Reset the block count. This will help avoid various segfaults
+             * from api calls that assume the array exists due to the count
+             * being non-zero.
+             */
+            *num_blks = 0;
             return false;
          }