diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2018-10-26 06:58:44 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2018-10-26 06:58:44 -0700 |
commit | d8185f6ae9d706f68e3ad3da5c1899ffffab415d (patch) | |
tree | 20d4aa7a36935ecdbb1e226dad3f36f1188d8f54 /vm.c | |
parent | 0b0ef7806b96292ad11378dad7f9c6ae8274ad71 (diff) | |
download | txr-d8185f6ae9d706f68e3ad3da5c1899ffffab415d.tar.gz txr-d8185f6ae9d706f68e3ad3da5c1899ffffab415d.tar.bz2 txr-d8185f6ae9d706f68e3ad3da5c1899ffffab415d.zip |
vm: bugfix: corruption of global desc list.
* vm.c (vm_make_desc): We must register the newly malloced
descriptor structure into the free list before calling cobj,
because calling cobj may trigger gc, which can blow away the
object pointed to by our vtail local variable. Alternatively,
we calculate vtail after doign the cobj. Obtaining vtail and
using it cannot be separated by gc.
Diffstat (limited to 'vm.c')
-rw-r--r-- | vm.c | 10 |
1 files changed, 5 insertions, 5 deletions
@@ -157,6 +157,11 @@ val vm_make_desc(val nlevels, val nregs, val bytecode, vd->self = nil; + vd->lnk.prev = vtail; + vd->lnk.next = vnull; + vnull->lnk.prev = vd; + vtail->lnk.next = vd; + desc = cobj(coerce(mem_t *, vd), vm_desc_s, &vm_desc_ops); vd->bytecode = bytecode; @@ -164,11 +169,6 @@ val vm_make_desc(val nlevels, val nregs, val bytecode, vd->symvec = symvec; vd->self = desc; - vd->lnk.prev = vtail; - vd->lnk.next = vnull; - vnull->lnk.prev = vd; - vtail->lnk.next = vd; - return desc; } } |