From 2a9525caabeab6a8d6cd54889d4a2b82505abb20 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 5 Sep 2018 07:06:25 +0900 Subject: Add `argv` and `argc` check in `OP_ENTER`; fix #4102 `argv` may be retrieved from an array whose `ptr` is `NULL` when it`s empty. --- src/vm.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) (limited to 'src/vm.c') diff --git a/src/vm.c b/src/vm.c index 43c3d120f..9c4580fb3 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1791,21 +1791,19 @@ RETRY_TRY_BLOCK: kargs = 0; } else { - if (!mrb_hash_p(argv[argc - 1])) { - if (r) { - kdict = mrb_hash_new(mrb); - kargs = 0; - } - else { - mrb_value str = mrb_str_new_lit(mrb, "Excepcted `Hash` as last argument for keyword arguments"); - mrb_exc_set(mrb, mrb_exc_new_str(mrb, E_ARGUMENT_ERROR, str)); - goto L_RAISE; - } + if (argv && argc > 0 && mrb_hash_p(argv[argc-1])) { + kdict = argv[argc-1]; + mrb_hash_check_kdict(mrb, kdict); + } + else if (r) { + kdict = mrb_hash_new(mrb); + kargs = 0; } else { - kdict = argv[argc-1]; + mrb_value str = mrb_str_new_lit(mrb, "Excepcted `Hash` as last argument for keyword arguments"); + mrb_exc_set(mrb, mrb_exc_new_str(mrb, E_ARGUMENT_ERROR, str)); + goto L_RAISE; } - mrb_hash_check_kdict(mrb, kdict); if (MRB_ASPEC_KEY(a) > 0) { kdict = mrb_hash_dup(mrb, kdict); } -- cgit v1.2.3