We've found that there's a buffer overrun bug in flex that's triggered by using alternation in a lookahead pattern.
Fortunately, we don't need to match the exact {NEWLINE} expression to detect an empty pragma. It suffices to verify that there are no non-space characters before any newline character. So we can use a simple [\r\n] to get the desired behavior while avoiding the flex bug. Fixes Piglit's 16385-consecutive-chars and 17000-consecutive-chars-identifier tests. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=82472 Signed-off-by: Carl Worth <cwo...@cworth.org> Approach-suggested-by: Kenneth Graunke <kenn...@whitecape.org> CC: Kenneth Graunke <kenn...@whitecape.org> --- Thanks for chasing down the fix for this regression of mine, Ken. I am embarrassed that I clearly didn't run piglit enough while testing my original branch. With your fix above, there is some state that's not updated as it should be when returning a NEWLINE token, (such as incrementing yylineno, etc.). I tried to improve things to update all that state, but it proved problematic, (putting the state updates in a common function doesn't work because only the outer lexing function has access to local variables like yylineno). The alternate approach here was your recommendation, of course. src/glsl/glcpp/glcpp-lex.l | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/glsl/glcpp/glcpp-lex.l b/src/glsl/glcpp/glcpp-lex.l index 98d500e..aaef7b8 100644 --- a/src/glsl/glcpp/glcpp-lex.l +++ b/src/glsl/glcpp/glcpp-lex.l @@ -289,8 +289,14 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]? } /* Swallow empty #pragma directives, (to avoid confusing the - * downstream compiler). */ -<HASH>pragma{HSPACE}*/{NEWLINE} { + * downstream compiler). + * + * Note: We use a simple regular expression for the lookahead + * here. Specifically, we cannot use the complete {NEWLINE} expression + * since it uses alternation and we've found that there's a flex bug + * where using alternation in the lookahead portion of a pattern + * triggers a buffer overrun. / +<HASH>pragma{HSPACE}*/[\r\n] { BEGIN INITIAL; } -- 2.0.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev