From b0db0bdd3a7de2a813c6b204e42bfaf0a8d11e34 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Sat, 22 Feb 2025 09:53:56 +0900 Subject: [PATCH] vm.c: add checks for visibility (private, protected); close #1835 --- src/vm.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/vm.c b/src/vm.c index 97ee579ea..20d9b4f85 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1834,7 +1834,6 @@ RETRY_TRY_BLOCK: CASE(OP_SSEND, BBB) { regs[a] = regs[0]; - insn = OP_SEND; } goto L_SENDB; @@ -1886,7 +1885,7 @@ RETRY_TRY_BLOCK: } mrb_assert(bidx < irep->nregs); - if (insn == OP_SEND) { + if (insn == OP_SEND || insn == OP_SSEND) { /* clear block argument */ SET_NIL_VALUE(regs[new_bidx]); SET_NIL_VALUE(blk); @@ -1907,6 +1906,16 @@ RETRY_TRY_BLOCK: else { ci->mid = mid; } + if (insn == OP_SEND || insn == OP_SENDB) { + if (m.flags & MRB_METHOD_PRIVATE_FL) { + mrb_value args = (ci->n == 15) ? regs[1] : mrb_ary_new_from_values(mrb, ci->n, regs+1); + mrb_no_method_error(mrb, mid, args, "private method '%n' called for %T", mid, recv); + } + else if ((m.flags & MRB_METHOD_PROTECTED_FL) && mrb_obj_is_kind_of(mrb, recv, ci->u.target_class)) { + mrb_value args = (ci->n == 15) ? regs[1] : mrb_ary_new_from_values(mrb, ci->n, regs+1); + mrb_no_method_error(mrb, mid, args, "proteced method '%n' called for %T", mid, recv); + } + } ci->cci = CINFO_NONE; if (MRB_METHOD_PROC_P(m)) {