summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2011-11-18 13:27:18 -0800
committerKaz Kylheku <kaz@kylheku.com>2011-11-18 13:27:18 -0800
commit469c98066160e682eda0fd2ba7a189e388ab9257 (patch)
tree38fca8299308a1d4e3ed1f83a8b0048bc0d05999
parent6d2bc0b88c6f0060bce5c79ee5879cf4ce77a35f (diff)
downloadtxr-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--ChangeLog13
-rw-r--r--gc.c2
-rw-r--r--lib.c4
3 files changed, 17 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 2c819949..5cb9f923 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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).
diff --git a/gc.c b/gc.c
index 8f1ee6dc..1f31cf54 100644
--- a/gc.c
+++ b/gc.c
@@ -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) {
diff --git a/lib.c b/lib.c
index 41bf5e8f..f1079030 100644
--- a/lib.c
+++ b/lib.c
@@ -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"));