summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2018-04-05 15:44:24 +0900
committerGitHub <[email protected]>2018-04-05 15:44:24 +0900
commite9ddb593f3f6c0264563eaf20f5de8cf43cc1c5d (patch)
tree7d9b24e305936173bf329ea40c5a04bbdec64f14 /src
parentf23c3cddc89d24430f8a8c6f44cdab4ecfe2d55d (diff)
parent26e436e24797f0c3228bc9900615afe7d2e29ddf (diff)
downloadmruby-e9ddb593f3f6c0264563eaf20f5de8cf43cc1c5d.tar.gz
mruby-e9ddb593f3f6c0264563eaf20f5de8cf43cc1c5d.zip
Merge pull request #3991 from take-cheeze/fix_eval_env_gc
Fix possible heap use after free in `mrb_exec_irep` and stack expanding.
Diffstat (limited to 'src')
-rw-r--r--src/vm.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/vm.c b/src/vm.c
index e5bbf657c..ae9bf2e69 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -156,6 +156,18 @@ envadjust(mrb_state *mrb, mrb_value *oldbase, mrb_value *newbase, size_t size)
e->stack = newbase + off;
}
+
+ if (ci->proc && MRB_PROC_ENV_P(ci->proc) && ci->env != MRB_PROC_ENV(ci->proc)) {
+ e = MRB_PROC_ENV(ci->proc);
+
+ if (e && MRB_ENV_STACK_SHARED_P(e) &&
+ (st = e->stack) && oldbase <= st && st < oldbase+size) {
+ ptrdiff_t off = e->stack - oldbase;
+
+ e->stack = newbase + off;
+ }
+ }
+
ci->stackent = newbase + (ci->stackent - oldbase);
ci++;
}