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: fd01840c0b ("glsl: add AoA support to subroutines")
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=100438
This commit is contained in:
George Barrett
2017-11-19 21:55:10 +11:00
committed by Timothy Arceri
parent 514db90448
commit f09c2cefdd

View File

@@ -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);