diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2011-11-18 13:27:18 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2011-11-18 13:27:18 -0800 |
commit | 469c98066160e682eda0fd2ba7a189e388ab9257 (patch) | |
tree | 38fca8299308a1d4e3ed1f83a8b0048bc0d05999 | |
parent | 6d2bc0b88c6f0060bce5c79ee5879cf4ce77a35f (diff) | |
download | txr-469c98066160e682eda0fd2ba7a189e388ab9257.tar.gz txr-469c98066160e682eda0fd2ba7a189e388ab9257.tar.bz2 txr-469c98066160e682eda0fd2ba7a189e388ab9257.zip |
* gc.c (mark_mem_region): Use the Valgrind API only to mark
the type field as accessible, not the whole object that
we are checking. Marking the whole object accessible hides
uninitialized field bugs!
* lib.c: And found a bug already: lazy_str was not completely
initializing all of the object fields (ls.prefix, ls.list)
before invoking memory allocating operations, making it
possible for the garbage collector to encounter uninitialized
object areas.
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | gc.c | 2 | ||||
-rw-r--r-- | lib.c | 4 |
3 files changed, 17 insertions, 2 deletions
@@ -1,5 +1,18 @@ 2011-11-18 Kaz Kylheku <kaz@kylheku.com> + * gc.c (mark_mem_region): Use the Valgrind API only to mark + the type field as accessible, not the whole object that + we are checking. Marking the whole object accessible hides + uninitialized field bugs! + + * lib.c: And found a bug already: lazy_str was not completely + initializing all of the object fields (ls.prefix, ls.list) + before invoking memory allocating operations, making it + possible for the garbage collector to encounter uninitialized + object areas. + +2011-11-18 Kaz Kylheku <kaz@kylheku.com> + Added a JSON parsing test case. This flushed out a bug which crashed the garbage collector (uninitialized fields in function objects). @@ -331,7 +331,7 @@ static void mark_mem_region(val *low, val *high) if (in_heap(maybe_obj)) { #ifdef HAVE_VALGRIND if (opt_vg_debug) - VALGRIND_MAKE_MEM_DEFINED(maybe_obj, sizeof *maybe_obj); + VALGRIND_MAKE_MEM_DEFINED(&maybe_obj->t.type, sizeof maybe_obj->t.type); #endif type_t t = maybe_obj->t.type; if ((t & FREE) == 0) { @@ -1853,7 +1853,9 @@ val lazy_str(val lst, val term, val limit) { val obj = make_obj(); obj->ls.type = LSTR; - obj->ls.opts = nil; /* Must init before calling something that can gc! */ + + /* Must init before calling something that can gc! */ + obj->ls.opts = obj->ls.list = obj->ls.prefix = nil; term = or2(term, string(L"\n")); |