diff options
-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")); |