glcpp: Reject garbage after #else and #endif tokens
authorMatt Turner <mattst88@gmail.com>
Tue, 6 Nov 2012 18:59:30 +0000 (10:59 -0800)
committerMatt Turner <mattst88@gmail.com>
Fri, 9 Nov 2012 22:33:08 +0000 (14:33 -0800)
commit060e69679925f171cfcc2a5f84fab1d833a7e804
tree6061b0f7d878ef3c0d74904b290b50f9b8b997e5
parentafcaa03f7ea6918ce7a9cab1b02ec97e05309a63
glcpp: Reject garbage after #else and #endif tokens

Previously we were accepting garbage after #else and #endif tokens when
the previous preprocessor conditional evaluated to false (eg, #if 0).

When the preprocessor hits a false conditional, it switches the lexer
into the SKIP state, in which it ignores non-control tokens. The parser
pops the SKIP state off the stack when it reaches the associated #elif,
#else, or #endif. Unfortunately, that meant that it only left the SKIP
state after the lexing the entire line containing the #token and thus
would accept garbage after the #token.

To fix this we use a mid-rule, which is executed immediately after the
#token is parsed.

NOTE: This is a candidate for the stable branch
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=56442
Fixes: preprocess17_frag.test from oglconform
Reviewed-by: Carl Worth <cworth@cworth.org> (glcpp-parse.y)
Acked-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/glsl/glcpp/glcpp-parse.y
src/glsl/glcpp/tests/102-garbage-after-endif.c [new file with mode: 0644]
src/glsl/glcpp/tests/102-garbage-after-endif.c.expected [new file with mode: 0644]
src/glsl/glcpp/tests/103-garbage-after-else.c [new file with mode: 0644]
src/glsl/glcpp/tests/103-garbage-after-else.c.expected [new file with mode: 0644]