glsl/linker: Validate IR just before reparenting.
authorPaul Berry <stereotype441@gmail.com>
Fri, 22 Nov 2013 20:37:22 +0000 (12:37 -0800)
committerPaul Berry <stereotype441@gmail.com>
Tue, 26 Nov 2013 21:22:24 +0000 (13:22 -0800)
commitd7fa9eb003bf0d2016ca1f7cb14e59ad22e89b93
tree10d75afb7a1827afa845fae4e70c9bd988f1e50b
parent9dfcb05fa649ee7a573eab3d16851ebd4cb96010
glsl/linker: Validate IR just before reparenting.

If reparent_ir() is called on invalid IR, then there's a danger that
it will fail to reparent all of the necessary nodes.  For example, if
the IR contains an ir_dereference_variable which refers to an
ir_variable that's not in the tree, that ir_variable won't get
reparented, resulting in subtle use-after-free bugs once the
non-reparented nodes are freed.  (This is exactly what happened in the
bug fixed by the previous commit).

This patch makes this kind of bug far easier to track down, by
transforming it from a use-after-free bug into an explicit IR
validation error.

Reviewed-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/glsl/linker.cpp