summaryrefslogtreecommitdiffstats
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
commit96fd4235ae9d4e6edddacf504d23e4a5e2dee943 (patch)
tree9a4cdcd103e6b312c00d2927a21ab4aac99dec69
parentf5c53b02a34d085b79f389ed910616c06d34ebce (diff)
downloadtxr-96fd4235ae9d4e6edddacf504d23e4a5e2dee943.tar.gz
txr-96fd4235ae9d4e6edddacf504d23e4a5e2dee943.tar.bz2
txr-96fd4235ae9d4e6edddacf504d23e4a5e2dee943.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.
-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;