glsl: Fix crashes caused by Bison error messages involving "'%'".
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 8 Dec 2011 09:35:48 +0000 (01:35 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 14 Dec 2011 06:54:16 +0000 (22:54 -0800)
commitc87cb98bb4e893e04831bf68231f5ed42e0b5b6f
tree7d7af40479e55c134c16f3e0102be7f59221e109
parent7e9cb2ac6dd9af5ea1597df8a2015b620aad57a1
glsl: Fix crashes caused by Bison error messages involving "'%'".

Invalid shaders containing the character % at an unexpected location
would cause Bison to call yyerror with a message of:

    syntax error, unexpected '%'

Bison expects yyerror() to take a string, while _mesa_glsl_error() is a
printf-style function.  This hit the classic printf string escape issue:

    _mesa_glsl_error(loc, state, "unexpected '%'");       // invalid!
    _mesa_glsl_error(loc, state, "%s", "unexpected '%'"); // correct.

This caused assertion failures after ralloc_asprintf_append called
vsnprintf to determine the length of the text that would be printed:
vsnprintf would see the invalid format and return -1, an invalid length.

The solution is to define a proper yyerror() wrapper function that calls
_mesa_glsl_error with the "%s".  Since we compile with -p "_mesa_glsl",
yyerror is defined as:

    #define yyerror         _mesa_glsl_error

So we have to #undef yyerror in order to be able to declare it.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=43564
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Acked-by: Paul Berry <stereotype441@gmail.com>
src/glsl/glsl_parser.yy