summaryrefslogtreecommitdiffstats
path: root/src/compiler/glsl/ast_function.cpp
diff options
context:
space:
mode:
authorGeorge Barrett <[email protected]>2017-11-19 21:55:10 +1100
committerTimothy Arceri <[email protected]>2017-11-20 11:04:04 +1100
commitf09c2cefdd53cd61562a994294e9d0630868d2da (patch)
tree2238fe96c95c03888b56a1f4f6a21cf6ff77ec71 /src/compiler/glsl/ast_function.cpp
parent514db90448ece28f6acaffea6358c715c47b359a (diff)
glsl: Catch subscripted calls to undeclared subroutines
generate_array_index fails to check whether the target of a subroutine call exists in the AST, potentially passing around null ir_rvalue pointers eventuating in abort/segfault. Fixes: fd01840c0bd3 ("glsl: add AoA support to subroutines") Reviewed-by: Timothy Arceri <[email protected]> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=100438
Diffstat (limited to 'src/compiler/glsl/ast_function.cpp')
-rw-r--r--src/compiler/glsl/ast_function.cpp9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/compiler/glsl/ast_function.cpp b/src/compiler/glsl/ast_function.cpp
index d1596c272e6..94e0a16a9c0 100644
--- a/src/compiler/glsl/ast_function.cpp
+++ b/src/compiler/glsl/ast_function.cpp
@@ -676,8 +676,13 @@ generate_array_index(void *mem_ctx, exec_list *instructions,
ir_variable *sub_var = NULL;
*function_name = array->primary_expression.identifier;
- match_subroutine_by_name(*function_name, actual_parameters,
- state, &sub_var);
+ if (!match_subroutine_by_name(*function_name, actual_parameters,
+ state, &sub_var)) {
+ _mesa_glsl_error(&loc, state, "Unknown subroutine `%s'",
+ *function_name);
+ *function_name = NULL; /* indicate error condition to caller */
+ return NULL;
+ }
ir_rvalue *outer_array_idx = idx->hir(instructions, state);
return new(mem_ctx) ir_dereference_array(sub_var, outer_array_idx);