summaryrefslogtreecommitdiffstats
path: root/struct.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2016-10-07 20:36:21 -0700
committerKaz Kylheku <kaz@kylheku.com>2016-10-07 20:36:21 -0700
commited9af7616e76f0a5111d3e5a56eb9d1d3025c1a6 (patch)
tree9f46e0eb81d232c91cd9e6ab6c16b10711dc7672 /struct.c
parentd66820e7169ff436a1c622bb82877ada2a5b0c68 (diff)
downloadtxr-ed9af7616e76f0a5111d3e5a56eb9d1d3025c1a6.tar.gz
txr-ed9af7616e76f0a5111d3e5a56eb9d1d3025c1a6.tar.bz2
txr-ed9af7616e76f0a5111d3e5a56eb9d1d3025c1a6.zip
bug: heap backpointer assignment in static-slot-ensure.
* struct.c (static_slot_ens_rec): Neglected use of set macro to store newval in freshly allocated slot, which means we corrupt garbage collection if this causes an old generation objet to point to a new generation object.
Diffstat (limited to 'struct.c')
-rw-r--r--struct.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/struct.c b/struct.c
index 29ee89d6..066b6f44 100644
--- a/struct.c
+++ b/struct.c
@@ -987,10 +987,10 @@ static val static_slot_ens_rec(val stype, val sym, val newval,
stsl = &st->stslot[st->nstslots];
if (inh_stsl == 0) {
- stsl->store = newval;
stsl->home_type = stype;
stsl->home_offs = st->nstslots;
stsl->home = &stsl->store;
+ set(stslot_loc(stsl), newval);
if (!opt_compat || opt_compat > 151)
inh_stsl = stsl;
} else {