]> git.saurik.com Git - bison.git/commitdiff
be sure to properly escape type names
authorAkim Demaille <akim@lrde.epita.fr>
Thu, 26 Jul 2012 10:14:50 +0000 (12:14 +0200)
committerAkim Demaille <akim@lrde.epita.fr>
Thu, 26 Jul 2012 12:20:47 +0000 (14:20 +0200)
* src/scan-code.l: Use obstack_quote when passing type_name to m4.
* tests/input.at (Code injection): New.
* NEWS: Document it.
Thanks to Paul Eggert for the wording.

NEWS
src/scan-code.l
tests/input.at

diff --git a/NEWS b/NEWS
index 53ae9647ac4962f04c7c335e11344e187de97c96..f4decfa821e6614f28ea8544312852b389a00cc7 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,11 @@ GNU Bison NEWS
 
 * Noteworthy changes in release ?.? (????-??-??) [?]
 
+ Bison no longer executes user-specified M4 code when processing a grammar.
+
+** Bug fixes
+
+  Type names are now properly escaped.
 
 * Noteworthy changes in release 2.6 (2012-07-19) [stable]
 
index bc2cd58050b0fb112eb90e8da05ac2e247c609c1..f872285c71560804626ca26ba08778e6dbf29e9e 100644 (file)
@@ -764,8 +764,9 @@ handle_action_dollar (symbol_list *rule, char *text, location dollar_loc)
             untyped_var_seen = true;
         }
 
-      obstack_fgrow1 (&obstack_for_string,
-                     "]b4_lhs_value([%s])[", type_name);
+      obstack_sgrow (&obstack_for_string, "]b4_lhs_value(");
+      obstack_quote (&obstack_for_string, type_name);
+      obstack_sgrow (&obstack_for_string, ")[");
       rule->action_props.is_value_used = true;
       break;
 
@@ -784,9 +785,10 @@ handle_action_dollar (symbol_list *rule, char *text, location dollar_loc)
             untyped_var_seen = true;
         }
 
-      obstack_fgrow3 (&obstack_for_string,
-                     "]b4_rhs_value(%d, %d, [%s])[",
-                     effective_rule_length, n, type_name);
+      obstack_fgrow2 (&obstack_for_string,
+                     "]b4_rhs_value(%d, %d, ", effective_rule_length, n);
+      obstack_quote (&obstack_for_string, type_name);
+      obstack_sgrow (&obstack_for_string, ")[");
       if (n > 0)
        symbol_list_n_get (effective_rule, n)->action_props.is_value_used =
          true;
index 836ff6d64ff5fdd22587bce694b03a04af5753ce..eb98cca4cc06220fb3a28e949acef7d1c5f4bf90 100644 (file)
@@ -1369,3 +1369,54 @@ AT_TEST([%define api.prefix foo], [-p bar], [input.y:1.9-18])
 m4_popdef([AT_TEST])
 
 AT_CLEANUP
+
+
+## ---------------- ##
+## Code injection.  ##
+## ---------------- ##
+
+
+AT_SETUP([[Code injection]])
+
+m4_pattern_allow([^m4_errprintn$])
+
+# AT_TEST([MACRO])
+# ----------------
+# Try to have MACRO be run by bison.
+m4_pushdef([AT_TEST],
+[AT_DATA([[input.y]],
+[[%type <$1(DEAD %type)> exp
+%token <$1(DEAD %token)> a
+%initial-action
+{
+  $$;
+  $<$1(DEAD %initial-action)>$
+};
+%%
+exp:
+  a a[last]
+  {
+    $$;
+    $][1;
+    $<$1(DEAD action 1)>$
+    $<$1(DEAD action 2)>1
+    $<$1(DEAD action 3)>last
+    $<$1(DEAD action 4)>0
+    ;
+  };
+]])
+
+# FIXME: Provide a means to iterate over all the skeletons.
+AT_BISON_CHECK([[-d               input.y]])
+AT_BISON_CHECK([[-d -S glr.c      input.y]])
+AT_BISON_CHECK([[-d -S lalr1.cc   input.y]])
+AT_BISON_CHECK([[-d -S glr.cc     input.y]])
+AT_BISON_CHECK([[   -S lalr1.java input.y]])
+])
+
+AT_TEST([m4_errprintn])
+AT_TEST([@:>@m4_errprintn])
+
+m4_popdef([AT_TEST])
+
+AT_CLEANUP