Skip to content

Need to synchronize dbg->regs after VM call in mrdb#6222

Merged
matz merged 1 commit into
mruby:masterfrom
dearblue:sync-regs
Mar 31, 2024
Merged

Need to synchronize dbg->regs after VM call in mrdb#6222
matz merged 1 commit into
mruby:masterfrom
dearblue:sync-regs

Conversation

@dearblue
Copy link
Copy Markdown
Contributor

VM inrush could invalidate addresses stored in dbg->regs by stack_extend().


To confirm the problem, apply the following patch to the current master and try rake test.

diff --git a/src/vm.c b/src/vm.c
index 1e7623478..2261acdf3 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -204,6 +204,16 @@ stack_extend(mrb_state *mrb, mrb_int room)
   if (!mrb->c->ci->stack || mrb->c->ci->stack + room >= mrb->c->stend) {
     stack_extend_alloc(mrb, room);
   }
+  else {
+    ptrdiff_t stsize = mrb->c->stend - mrb->c->stbase;
+    mrb_value *newstack = (mrb_value*)mrb_malloc(mrb, stsize * sizeof(mrb_value));
+    memcpy(newstack, mrb->c->stbase, stsize * sizeof(mrb_value));
+    memset(mrb->c->stbase, -1, stsize * sizeof(mrb_value));
+    mrb_free(mrb, mrb->c->stbase);
+    envadjust(mrb, mrb->c->stbase, newstack, stsize);
+    mrb->c->stbase = newstack;
+    mrb->c->stend = mrb->c->stbase + stsize;
+  }
 }

 MRB_API void

Here is an excerpt from one of the errors:

NoMethodError: mruby-bin-debugger(print) normal => undefined method `start_with?' for nil:NilClass (mrbgems: mruby-bin-debugger)
backtrace:
        /var/tmp/mruby/test/assert.rb:241:in `_assert_operator'
        /var/tmp/mruby/test/assert.rb:237:in `assert_operator'
        /var/tmp/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb:32:in `block (2 levels) in test'
        /var/tmp/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb:28:in `each'
        /var/tmp/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb:28:in `block in test'
        /var/tmp/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb:24:in `each'
        /var/tmp/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb:24:in `test'
        /var/tmp/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb:87:in `block in <top (required)>'
        /var/tmp/mruby/test/assert.rb:101:in `assert'
        /var/tmp/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb:70:in `<top (required)>'
        /var/tmp/mruby/test/bintest.rb:52:in `load'
        /var/tmp/mruby/test/bintest.rb:52:in `block (2 levels) in <main>'
        /var/tmp/mruby/test/bintest.rb:50:in `each'
        /var/tmp/mruby/test/bintest.rb:50:in `block in <main>'
        /var/tmp/mruby/test/bintest.rb:40:in `each'
        /var/tmp/mruby/test/bintest.rb:40:in `<main>'

VM inrush could invalidate addresses stored in `dbg->regs` by `stack_extend()`.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants