Mesa (master): glcpp: Reject garbage after #else and #endif tokens

Matt Turner mattst88 at kemper.freedesktop.org
Fri Nov 9 22:31:36 UTC 2012


Module: Mesa
Branch: master
Commit: 060e69679925f171cfcc2a5f84fab1d833a7e804
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=060e69679925f171cfcc2a5f84fab1d833a7e804

Author: Matt Turner <mattst88 at gmail.com>
Date:   Tue Nov  6 10:59:30 2012 -0800

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 at cworth.org> (glcpp-parse.y)
Acked-by: Ian Romanick <ian.d.romanick at intel.com>
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

---

 src/glsl/glcpp/glcpp-parse.y                       |    8 ++++----
 src/glsl/glcpp/tests/102-garbage-after-endif.c     |    2 ++
 .../glcpp/tests/102-garbage-after-endif.c.expected |    2 ++
 src/glsl/glcpp/tests/103-garbage-after-else.c      |    3 +++
 .../glcpp/tests/103-garbage-after-else.c.expected  |    4 ++++
 5 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/src/glsl/glcpp/glcpp-parse.y b/src/glsl/glcpp/glcpp-parse.y
index 40c43c6..16d2965 100644
--- a/src/glsl/glcpp/glcpp-parse.y
+++ b/src/glsl/glcpp/glcpp-parse.y
@@ -327,12 +327,12 @@ control_line:
 			glcpp_warning(& @1, parser, "ignoring illegal #elif without expression");
 		}
 	}
-|	HASH_ELSE NEWLINE {
+|	HASH_ELSE {
 		_glcpp_parser_skip_stack_change_if (parser, & @1, "else", 1);
-	}
-|	HASH_ENDIF NEWLINE {
+	} NEWLINE
+|	HASH_ENDIF {
 		_glcpp_parser_skip_stack_pop (parser, & @1);
-	}
+	} NEWLINE
 |	HASH_VERSION integer_constant NEWLINE {
 		macro_t *macro = hash_table_find (parser->defines, "__VERSION__");
 		if (macro) {
diff --git a/src/glsl/glcpp/tests/102-garbage-after-endif.c b/src/glsl/glcpp/tests/102-garbage-after-endif.c
new file mode 100644
index 0000000..301779e
--- /dev/null
+++ b/src/glsl/glcpp/tests/102-garbage-after-endif.c
@@ -0,0 +1,2 @@
+#if 0
+#endif garbage
diff --git a/src/glsl/glcpp/tests/102-garbage-after-endif.c.expected b/src/glsl/glcpp/tests/102-garbage-after-endif.c.expected
new file mode 100644
index 0000000..d9f3bdc
--- /dev/null
+++ b/src/glsl/glcpp/tests/102-garbage-after-endif.c.expected
@@ -0,0 +1,2 @@
+0:2(8): preprocessor error: syntax error, unexpected IDENTIFIER, expecting NEWLINE
+
diff --git a/src/glsl/glcpp/tests/103-garbage-after-else.c b/src/glsl/glcpp/tests/103-garbage-after-else.c
new file mode 100644
index 0000000..c460fea
--- /dev/null
+++ b/src/glsl/glcpp/tests/103-garbage-after-else.c
@@ -0,0 +1,3 @@
+#if 0
+#else garbage
+#endif
diff --git a/src/glsl/glcpp/tests/103-garbage-after-else.c.expected b/src/glsl/glcpp/tests/103-garbage-after-else.c.expected
new file mode 100644
index 0000000..f9f5f19
--- /dev/null
+++ b/src/glsl/glcpp/tests/103-garbage-after-else.c.expected
@@ -0,0 +1,4 @@
+0:2(7): preprocessor error: syntax error, unexpected IDENTIFIER, expecting NEWLINE
+0:1(7): preprocessor error: Unterminated #if
+
+




More information about the mesa-commit mailing list