summaryrefslogtreecommitdiffstats
path: root/vm.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2018-04-17 06:59:29 -0700
committerKaz Kylheku <kaz@kylheku.com>2018-04-17 06:59:29 -0700
commit392f2f4b28c44d208b551e1354a02fe392968c0d (patch)
tree9a4cdcd103e6b312c00d2927a21ab4aac99dec69 /vm.c
parent245884375b2d8e2a6d856a85e281e84147a1caa7 (diff)
downloadtxr-392f2f4b28c44d208b551e1354a02fe392968c0d.tar.gz
txr-392f2f4b28c44d208b551e1354a02fe392968c0d.tar.bz2
txr-392f2f4b28c44d208b551e1354a02fe392968c0d.zip
vm: clear stack memory moved to heap.
* vm.c (vm_make_closure): When a display frame is captured by a closure and moves into the heap object, the original should be cleared to all nil values, otherwise it can cause spurious retention of garbage.
Diffstat (limited to 'vm.c')
-rw-r--r--vm.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/vm.c b/vm.c
index d06c2ee2..25a7b713 100644
--- a/vm.c
+++ b/vm.c
@@ -245,9 +245,11 @@ static val vm_make_closure(struct vm *vm, int frsz)
case NUM:
{
val heap_vec = vector(vec, nil);
+ size_t size = sizeof *cdi->mem * c_num(vec);
cdi->vec = heap_vec;
cdi->mem = heap_vec->v.vec;
- memcpy(cdi->mem, mem, sizeof *cdi->mem * c_num(vec));
+ memcpy(cdi->mem, mem, size);
+ memset(mem, 0, size);
mut(closure);
*sdi = *cdi;
break;