From a3a8b11d4b47a1ddfda8fe05aefa12c77b24a1cc Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Mon, 1 Sep 2014 09:01:00 +0900 Subject: [PATCH] lset/lerf can access to torn-off regions because of call/cc --- vm.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/vm.c b/vm.c index 757fe7a3..6d843d67 100644 --- a/vm.c +++ b/vm.c @@ -668,10 +668,22 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value argv) NEXT; } CASE(OP_LREF) { + pic_callinfo *ci = pic->ci; + + if (ci->env != NULL && ci->env->regs == ci->env->storage) { + PUSH(ci->env->regs[c.u.i - (ci->regs - ci->fp)]); + NEXT; + } PUSH(pic->ci->fp[c.u.i]); NEXT; } CASE(OP_LSET) { + pic_callinfo *ci = pic->ci; + + if (ci->env != NULL && ci->env->regs == ci->env->storage) { + ci->env->regs[c.u.i - (ci->regs - ci->fp)] = POP(); + NEXT; + } pic->ci->fp[c.u.i] = POP(); NEXT; }