[Mesa-dev] [PATCH 0/5] compiler/glsl: fix crashes when running with ubsan

Nicolai Hähnle nhaehnle at gmail.com
Sat May 7 22:05:03 UTC 2016


this is a re-send of two patches that didn't get anybody's attention, when I
sent them out last week, plus some additional fixes for rarer instances of
the same problem that I've encountered since then.

The problem that these patches fix is simple: the exec_list iterations often
cast sentinel nodes that are mere exec_nodes to ir_* types. This leads to
crashes when running ubsan, because ubsan attempts to verify the type of the

Since the target type has a virtual method table, it does the verification by
calling into the dynamic_cast implementation, under the assumption that this
virtual method table is there. However, since the object is really only an
exec_node, which _doesn't_ have a virtual method table, ubsan crashes.

So I've converted loops into forms that only do the cast once we are assured
that we are not looking at a sentinel node. This looks a bit funny in the
macros, because an additional outer for-loop is used to define a variable of
a different type, but the compiler is able to remove that outer loop and the
__flag variable entirely.

Please review!

 src/compiler/glsl/ast_function.cpp           |   4 +-
 .../glsl/link_uniform_initializers.cpp       |   8 +-
 src/compiler/glsl/list.h                     | 147 ++++++++++++-----
 src/compiler/glsl/lower_jumps.cpp            |   7 +-
 src/compiler/glsl/opt_dead_code_local.cpp    |   7 +-
 src/compiler/glsl/opt_tree_grafting.cpp      |  10 +-
 6 files changed, 111 insertions(+), 72 deletions(-)

More information about the mesa-dev mailing list