From c434dabdc79602d8dec2d722a0002704daa8ff5a Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Wed, 28 Feb 2024 08:08:29 -0800 Subject: seq_build: safeguard against adding to finished object. * lib.c (seq_build_convert_to_finished): New function. (seq_build_list_finish): call seq_build_convert_to_finished. (sb_finished_ops): New static struct. All operations except mark are null pointers so this will crash if used. --- lib.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib.c b/lib.c index 9acb9abe..41f5db72 100644 --- a/lib.c +++ b/lib.c @@ -1502,6 +1502,8 @@ static void seq_build_list_pend(seq_build_t *bu, val item) seq_build_convert_to_improper(bu, item); } +static void seq_build_convert_to_finished(seq_build_t *bu); + static void seq_build_list_finish(seq_build_t *bu) { val obj = bu->obj; @@ -1511,18 +1513,22 @@ static void seq_build_list_finish(seq_build_t *bu) us_rplacd(obj, nil); bu->obj = head; } + + seq_build_convert_to_finished(bu); } static void seq_build_struct_finish(seq_build_t *bu) { seq_build_list_finish(bu); bu->obj = funcall1(bu->u.from_list_meth, bu->obj); + seq_build_convert_to_finished(bu); } static void seq_build_carray_finish(seq_build_t *bu) { seq_build_list_finish(bu); bu->obj = carray_list(bu->obj, bu->u.carray_type, nil); + seq_build_convert_to_finished(bu); } static void seq_build_improper_add(seq_build_t *bu, val item) @@ -1586,6 +1592,9 @@ static struct seq_build_ops seq_build_improper_finish, seq_build_obj_mark); +static struct seq_build_ops + sb_finished_ops = seq_build_ops_init(0, 0, 0, seq_build_obj_mark); + static void seq_build_convert_to_list(seq_build_t *bu, val list) { if (list) { @@ -1614,6 +1623,11 @@ static void seq_build_convert_to_improper(seq_build_t *bu, val atom) bu->ops = &sb_improper_ops; } +static void seq_build_convert_to_finished(seq_build_t *bu) +{ + bu->ops = &sb_finished_ops; +} + void seq_build_init(val self, seq_build_t *bu, val likeobj) { bu->self = self; -- cgit v1.2.3