glsl: Reject C-style initializers with unknown types. 99/7499/1
authorMatt Turner <mattst88@gmail.com>
Fri, 12 Jul 2013 18:05:38 +0000 (11:05 -0700)
committerMatt Turner <mattst88@gmail.com>
Mon, 15 Jul 2013 20:02:36 +0000 (13:02 -0700)
commitc889df3fbed64be8669d21e3d3c5d6db913255da
tree8db593436310f8bd61205343fd9f675c1f5fdd56
parent7706e52b2549bb862c066a28cd57c2402ff5b3d7
glsl: Reject C-style initializers with unknown types.

_mesa_ast_set_aggregate_type walks through declarations initialized with
C-style aggregate initializers and stops when it runs out of LHS
declarations or RHS expressions.

In the example

   vec4 v = {{{1, 2, 3, 4}}};

_mesa_ast_set_aggregate_type would not recurse into the subexpressions
(since vec4s do not contain types that can be initialized with an
aggregate initializer) to set their <constructor_type>s. Later in ::hir
we would dereference the NULL pointer and segfault.

If <constructor_type> is NULL in ::hir we know that the LHS and RHS
were unbalanced and the code is illegal.

Arrays, structs, and matrices were unaffected.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Chris Forbes <chrisf@ijw.co.nz>
src/glsl/ast_function.cpp