[Groonga-commit] groonga/groonga at 26f0518 [master] ruby_eval:Fixed crash when ruby_eval returned syntax error.

Back to archive index

ryo-pinus null+****@clear*****
Sun Aug 27 14:40:45 JST 2017


ryo-pinus	2017-08-27 14:40:45 +0900 (Sun, 27 Aug 2017)

  New Revision: 26f0518999b40c7f51b43c5139a84cb756cea1e9
  https://github.com/groonga/groonga/commit/26f0518999b40c7f51b43c5139a84cb756cea1e9

  Merged 5694e94: Merge pull request #758 from ryo-pinus/fix-crash-when-ruby_eval-returned-syntax-error

  Message:
    ruby_eval:Fixed crash when ruby_eval returned syntax error.
    
    fix #751

  Added files:
    test/command/suite/ruby/eval/syntaxerror/unexpected_dot.expected
    test/command/suite/ruby/eval/syntaxerror/unexpected_dot.test
    test/command/suite/ruby/eval/syntaxerror/unexpected_end.expected
    test/command/suite/ruby/eval/syntaxerror/unexpected_end.test
    test/command/suite/ruby/eval/syntaxerror/unexpected_equal.expected
    test/command/suite/ruby/eval/syntaxerror/unexpected_equal.test
  Modified files:
    lib/mrb/mrb_eval_context.c

  Modified: lib/mrb/mrb_eval_context.c (+27 -2)
===================================================================
--- lib/mrb/mrb_eval_context.c    2017-08-26 10:15:29 +0900 (d437a9932)
+++ lib/mrb/mrb_eval_context.c    2017-08-27 14:40:45 +0900 (b4cbab622)
@@ -33,11 +33,36 @@ eval_context_compile(mrb_state *mrb, mrb_value self)
 {
   char *script;
   mrb_int script_length;
+  mrbc_context* ctx;
   struct mrb_parser_state *parser;
   struct RProc *proc;
 
+  ctx = mrbc_context_new(mrb);
+  if (!ctx)
+  {
+    mrb_raise(mrb,E_RUNTIME_ERROR, "mrbc_context_new failed.");
+  }
+  ctx->capture_errors = 1;
+
   mrb_get_args(mrb, "s", &script, &script_length);
-  parser = mrb_parse_nstring(mrb, script, script_length, NULL);
+  parser = mrb_parse_nstring(mrb, script, script_length, ctx);
+  if (!parser)
+  {
+    mrbc_context_free(mrb, ctx);
+    mrb_raise(mrb,E_RUNTIME_ERROR, "mrb_parse_nstring failed.");
+  }
+  if (parser->nerr > 0)
+  {
+    mrb_value errormessage = mrb_format(mrb, "line %S:%S: %S",
+      mrb_fixnum_value(parser->error_buffer[0].lineno),
+      mrb_fixnum_value(parser->error_buffer[0].column),
+      mrb_str_new_cstr(mrb, parser->error_buffer[0].message));
+    mrb_parser_free(parser);
+    mrbc_context_free(mrb, ctx);
+
+    mrb_raisef(mrb, E_ARGUMENT_ERROR, "%S", errormessage);
+  }
+
   proc = mrb_generate_code(mrb, parser);
   {
     mrb_code *iseq = proc->body.irep->iseq;
@@ -47,7 +72,7 @@ eval_context_compile(mrb_state *mrb, mrb_value self)
     *iseq = MKOP_AB(OP_RETURN, 1, OP_R_NORMAL);
   }
   mrb_parser_free(parser);
-
+  mrbc_context_free(mrb, ctx);
   return mrb_obj_value(proc);
 }
 

  Added: test/command/suite/ruby/eval/syntaxerror/unexpected_dot.expected (+15 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/ruby/eval/syntaxerror/unexpected_dot.expected    2017-08-27 14:40:45 +0900 (31a6bb150)
@@ -0,0 +1,15 @@
+plugin_register ruby/eval
+[[0,0.0,0.0],true]
+ruby_eval "."
+[
+  [
+    0,
+    0.0,
+    0.0
+  ],
+  {
+    "exception": {
+      "message": "line 1:1: syntax error, unexpected '.'"
+    }
+  }
+]

  Added: test/command/suite/ruby/eval/syntaxerror/unexpected_dot.test (+5 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/ruby/eval/syntaxerror/unexpected_dot.test    2017-08-27 14:40:45 +0900 (6c17e15ad)
@@ -0,0 +1,5 @@
+#@on-error omit
+plugin_register ruby/eval
+#@on-error default
+
+ruby_eval "."

  Added: test/command/suite/ruby/eval/syntaxerror/unexpected_end.expected (+15 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/ruby/eval/syntaxerror/unexpected_end.expected    2017-08-27 14:40:45 +0900 (d87025abd)
@@ -0,0 +1,15 @@
+plugin_register ruby/eval
+[[0,0.0,0.0],true]
+ruby_eval "begin"
+[
+  [
+    0,
+    0.0,
+    0.0
+  ],
+  {
+    "exception": {
+      "message": "line 1:5: syntax error, unexpected $end"
+    }
+  }
+]

  Added: test/command/suite/ruby/eval/syntaxerror/unexpected_end.test (+5 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/ruby/eval/syntaxerror/unexpected_end.test    2017-08-27 14:40:45 +0900 (ac78b17a8)
@@ -0,0 +1,5 @@
+#@on-error omit
+plugin_register ruby/eval
+#@on-error default
+
+ruby_eval "begin"

  Added: test/command/suite/ruby/eval/syntaxerror/unexpected_equal.expected (+15 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/ruby/eval/syntaxerror/unexpected_equal.expected    2017-08-27 14:40:45 +0900 (b6874648c)
@@ -0,0 +1,15 @@
+plugin_register ruby/eval
+[[0,0.0,0.0],true]
+ruby_eval "="
+[
+  [
+    0,
+    0.0,
+    0.0
+  ],
+  {
+    "exception": {
+      "message": "line 1:1: syntax error, unexpected '='"
+    }
+  }
+]

  Added: test/command/suite/ruby/eval/syntaxerror/unexpected_equal.test (+5 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/ruby/eval/syntaxerror/unexpected_equal.test    2017-08-27 14:40:45 +0900 (8453e3b75)
@@ -0,0 +1,5 @@
+#@on-error omit
+plugin_register ruby/eval
+#@on-error default
+
+ruby_eval "="
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index