summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2018-09-05 07:06:25 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2018-09-05 07:06:25 +0900
commit2a9525caabeab6a8d6cd54889d4a2b82505abb20 (patch)
treec4f828cf704e8b2b91500319a2064632c3170a99
parent9b5910bd0f674f5948cd1185e07d8a024477d162 (diff)
downloadmruby-2a9525caabeab6a8d6cd54889d4a2b82505abb20.tar.gz
mruby-2a9525caabeab6a8d6cd54889d4a2b82505abb20.zip
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.
-rw-r--r--src/vm.c22
1 files changed, 10 insertions, 12 deletions
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);
}