Skip to content

Commit 3623a83

Browse files
committed
Protect exceptions within main() function
1 parent 9a962ed commit 3623a83

File tree

1 file changed

+58
-47
lines changed
  • mrbgems/mruby-bin-mruby/tools/mruby

1 file changed

+58
-47
lines changed

mrbgems/mruby-bin-mruby/tools/mruby/mruby.c

Lines changed: 58 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <mruby/compile.h>
77
#include <mruby/dump.h>
88
#include <mruby/variable.h>
9+
#include <mruby/throw.h>
910

1011
#ifdef MRB_DISABLE_STDIO
1112
static void
@@ -176,6 +177,8 @@ main(int argc, char **argv)
176177
mrbc_context *c;
177178
mrb_value v;
178179
mrb_sym zero_sym;
180+
struct mrb_jmpbuf c_jmp;
181+
int ai;
179182

180183
if (mrb == NULL) {
181184
fputs("Invalid mrb_state, exiting mruby\n", stderr);
@@ -189,59 +192,67 @@ main(int argc, char **argv)
189192
return n;
190193
}
191194

192-
ARGV = mrb_ary_new_capa(mrb, args.argc);
193-
for (i = 0; i < args.argc; i++) {
194-
char* utf8 = mrb_utf8_from_locale(args.argv[i], -1);
195-
if (utf8) {
196-
mrb_ary_push(mrb, ARGV, mrb_str_new_cstr(mrb, utf8));
197-
mrb_utf8_free(utf8);
195+
ai = mrb_gc_arena_save(mrb);
196+
MRB_TRY(&c_jmp) {
197+
mrb->jmp = &c_jmp;
198+
ARGV = mrb_ary_new_capa(mrb, args.argc);
199+
for (i = 0; i < args.argc; i++) {
200+
char* utf8 = mrb_utf8_from_locale(args.argv[i], -1);
201+
if (utf8) {
202+
mrb_ary_push(mrb, ARGV, mrb_str_new_cstr(mrb, utf8));
203+
mrb_utf8_free(utf8);
204+
}
198205
}
199-
}
200-
mrb_define_global_const(mrb, "ARGV", ARGV);
201-
202-
c = mrbc_context_new(mrb);
203-
if (args.verbose)
204-
c->dump_result = TRUE;
205-
if (args.check_syntax)
206-
c->no_exec = TRUE;
207-
208-
/* Set $0 */
209-
zero_sym = mrb_intern_lit(mrb, "$0");
210-
if (args.rfp) {
211-
const char *cmdline;
212-
cmdline = args.cmdline ? args.cmdline : "-";
213-
mrbc_filename(mrb, c, cmdline);
214-
mrb_gv_set(mrb, zero_sym, mrb_str_new_cstr(mrb, cmdline));
215-
}
216-
else {
217-
mrbc_filename(mrb, c, "-e");
218-
mrb_gv_set(mrb, zero_sym, mrb_str_new_lit(mrb, "-e"));
219-
}
206+
mrb_define_global_const(mrb, "ARGV", ARGV);
220207

221-
/* Load program */
222-
if (args.mrbfile) {
223-
v = mrb_load_irep_file_cxt(mrb, args.rfp, c);
224-
}
225-
else if (args.rfp) {
226-
v = mrb_load_file_cxt(mrb, args.rfp, c);
227-
}
228-
else {
229-
char* utf8 = mrb_utf8_from_locale(args.cmdline, -1);
230-
if (!utf8) abort();
231-
v = mrb_load_string_cxt(mrb, utf8, c);
232-
mrb_utf8_free(utf8);
233-
}
208+
c = mrbc_context_new(mrb);
209+
if (args.verbose)
210+
c->dump_result = TRUE;
211+
if (args.check_syntax)
212+
c->no_exec = TRUE;
213+
214+
/* Set $0 */
215+
zero_sym = mrb_intern_lit(mrb, "$0");
216+
if (args.rfp) {
217+
const char *cmdline;
218+
cmdline = args.cmdline ? args.cmdline : "-";
219+
mrbc_filename(mrb, c, cmdline);
220+
mrb_gv_set(mrb, zero_sym, mrb_str_new_cstr(mrb, cmdline));
221+
}
222+
else {
223+
mrbc_filename(mrb, c, "-e");
224+
mrb_gv_set(mrb, zero_sym, mrb_str_new_lit(mrb, "-e"));
225+
}
226+
227+
/* Load program */
228+
if (args.mrbfile) {
229+
v = mrb_load_irep_file_cxt(mrb, args.rfp, c);
230+
}
231+
else if (args.rfp) {
232+
v = mrb_load_file_cxt(mrb, args.rfp, c);
233+
}
234+
else {
235+
char* utf8 = mrb_utf8_from_locale(args.cmdline, -1);
236+
if (!utf8) abort();
237+
v = mrb_load_string_cxt(mrb, utf8, c);
238+
mrb_utf8_free(utf8);
239+
}
234240

235-
mrbc_context_free(mrb, c);
236-
if (mrb->exc) {
237-
if (!mrb_undef_p(v)) {
238-
mrb_print_error(mrb);
241+
mrb_gc_arena_restore(mrb, ai);
242+
mrbc_context_free(mrb, c);
243+
if (mrb->exc) {
244+
if (!mrb_undef_p(v)) {
245+
mrb_print_error(mrb);
246+
}
247+
n = -1;
248+
}
249+
else if (args.check_syntax) {
250+
printf("Syntax OK\n");
239251
}
240-
n = -1;
241252
}
242-
else if (args.check_syntax) {
243-
printf("Syntax OK\n");
253+
MRB_CATCH(&c_jmp) { /* error */
244254
}
255+
MRB_END_EXC(&c_jmp);
245256
cleanup(mrb, &args);
246257

247258
return n == 0 ? EXIT_SUCCESS : EXIT_FAILURE;

0 commit comments

Comments
 (0)