浏览代码

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>
tags/mesa-10.1-rc1
Paul Berry 12 年前
父节点
当前提交
d7fa9eb003
共有 1 个文件被更改,包括 5 次插入0 次删除
  1. 5
    0
      src/glsl/linker.cpp

+ 5
- 0
src/glsl/linker.cpp 查看文件

@@ -2396,6 +2396,11 @@ done:
if (prog->_LinkedShaders[i] == NULL)
continue;

/* Do a final validation step to make sure that the IR wasn't
* invalidated by any modifications performed after intrastage linking.
*/
validate_ir_tree(prog->_LinkedShaders[i]->ir);

/* Retain any live IR, but trash the rest. */
reparent_ir(prog->_LinkedShaders[i]->ir, prog->_LinkedShaders[i]->ir);


正在加载...
取消
保存