From 59ab494dee4a92db04c0c4386b135fcdbaf1cbc4 Mon Sep 17 00:00:00 2001 From: Philippe Proulx Date: Fri, 20 Mar 2015 20:28:53 -0400 Subject: [PATCH] Fix: ir: seq copy: initialize internal array MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Philippe Proulx Signed-off-by: Jérémie Galarneau --- formats/ctf/ir/event-fields.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/formats/ctf/ir/event-fields.c b/formats/ctf/ir/event-fields.c index f524d5db..55316f49 100644 --- a/formats/ctf/ir/event-fields.c +++ b/formats/ctf/ir/event-fields.c @@ -1975,12 +1975,38 @@ int bt_ctf_field_sequence_copy(struct bt_ctf_field *src, { int ret = 0, i; struct bt_ctf_field_sequence *sequence_src, *sequence_dst; + struct bt_ctf_field *src_length; + struct bt_ctf_field *dst_length; sequence_src = container_of(src, struct bt_ctf_field_sequence, parent); sequence_dst = container_of(dst, struct bt_ctf_field_sequence, parent); - g_ptr_array_set_size(sequence_dst->elements, - sequence_src->elements->len); + src_length = bt_ctf_field_sequence_get_length(src); + + if (!src_length) { + /* no length set yet: keep destination sequence empty */ + goto end; + } + + /* copy source length */ + dst_length = bt_ctf_field_copy(src_length); + bt_ctf_field_put(src_length); + + if (!dst_length) { + ret = -1; + goto end; + } + + /* this will initialize the destination sequence's internal array */ + ret = bt_ctf_field_sequence_set_length(dst, dst_length); + bt_ctf_field_put(dst_length); + + if (ret) { + goto end; + } + + assert(sequence_dst->elements->len == sequence_src->elements->len); + for (i = 0; i < sequence_src->elements->len; i++) { struct bt_ctf_field *field_copy = bt_ctf_field_copy( g_ptr_array_index(sequence_src->elements, i)); @@ -1989,6 +2015,7 @@ int bt_ctf_field_sequence_copy(struct bt_ctf_field *src, ret = -1; goto end; } + g_ptr_array_index(sequence_dst->elements, i) = field_copy; } end: -- 2.34.1