diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2018-09-05 07:06:25 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2018-09-05 07:06:25 +0900 |
| commit | 2a9525caabeab6a8d6cd54889d4a2b82505abb20 (patch) | |
| tree | c4f828cf704e8b2b91500319a2064632c3170a99 /src | |
| parent | 9b5910bd0f674f5948cd1185e07d8a024477d162 (diff) | |
| download | mruby-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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/vm.c | 22 |
1 files changed, 10 insertions, 12 deletions
@@ -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); } |
