sec = bt_ctf_event_get_stream_event_context(event);
if (!sec) {
- fprintf(err, "[error] %s in %s:%d\n", __func__,
- __FILE__, __LINE__);
goto end;
}
field = get_stream_event_context_field(err, event, field_name);
if (!field) {
- fprintf(err, "[error] %s in %s:%d\n", __func__,
- __FILE__, __LINE__);
goto error;
}
__func__, __FILE__, __LINE__);
goto error;
}
- bt_get(writer_packet);
writer_packet_context = ctf_copy_packet_context(debug_it->err, packet,
- writer_stream);
+ writer_stream, 0);
if (!writer_packet_context) {
fprintf(debug_it->err, "[error] %s in %s:%d\n",
__func__, __FILE__, __LINE__);
__func__, __FILE__, __LINE__);
goto end;
}
+ bt_get(writer_stream);
g_hash_table_remove(debug_it->stream_map, stream);
end:
struct debug_info_source *dbg_info_src,
struct debug_info_component *component)
{
- int i, nr_fields, ret;
+ int i, nr_fields, ret = 0;
struct bt_ctf_field_type *debug_field_type = NULL;
struct bt_ctf_field *field = NULL;
struct bt_ctf_field_type *field_type = NULL;
struct debug_info *debug_info,
struct debug_info_component *component)
{
- struct bt_ctf_field_type *writer_event_context_type = NULL;
+ struct bt_ctf_field_type *writer_event_context_type = NULL,
+ *event_context_type = NULL;
struct bt_ctf_field *writer_event_context = NULL;
struct bt_ctf_field *field = NULL, *copy_field = NULL, *debug_field = NULL;
struct bt_ctf_field_type *field_type = NULL;
goto error;
}
+ event_context_type = bt_ctf_field_get_type(event_context);
+ if (!event_context_type) {
+ fprintf(err, "[error] %s in %s:%d\n", __func__,
+ __FILE__, __LINE__);
+ goto error;
+ }
+
/*
* If it is not a structure, we did not modify it to add the debug info
* fields, so just assign it as is.
goto error;
}
- field = bt_ctf_field_structure_get_field_by_index(event_context, i);
+ /*
+ * Prevent illegal access in the event_context.
+ */
+ if (i < bt_ctf_field_type_structure_get_field_count(event_context_type)) {
+ field = bt_ctf_field_structure_get_field_by_index(event_context, i);
+ }
/*
* The debug_info field, only exists in the writer event or
* if it was set by a earlier pass of the debug_info plugin.
- *
- * FIXME: are we replacing an exisiting debug_info struct here ??
*/
if (!strcmp(field_name, component->arg_debug_info_field_name) &&
!field) {
error:
ret = -1;
end:
+ bt_put(event_context_type);
bt_put(writer_event_context_type);
bt_put(writer_event_context);
bt_put(field);
goto error;
}
+ /* Optional field, so it can fail silently. */
field = bt_ctf_event_get_header(event);
- if (!field) {
- fprintf(err, "[error] %s in %s:%d\n", __func__,
- __FILE__, __LINE__);
- goto error;
- }
-
- ret = ctf_copy_event_header(err, event, writer_event_class,
- writer_event, field);
- if (ret) {
- fprintf(err, "[error] %s in %s:%d\n", __func__,
- __FILE__, __LINE__);
- goto error;
+ if (field) {
+ ret = ctf_copy_event_header(err, event, writer_event_class,
+ writer_event, field);
+ if (ret) {
+ fprintf(err, "[error] %s in %s:%d\n", __func__,
+ __FILE__, __LINE__);
+ goto error;
+ }
+ BT_PUT(field);
}
- BT_PUT(field);
/* Optional field, so it can fail silently. */
field = bt_ctf_event_get_stream_event_context(event);
/* Optional field, so it can fail silently. */
field = bt_ctf_event_get_event_context(event);
- copy_field = bt_ctf_field_copy(field);
- if (copy_field) {
+ if (field) {
+ copy_field = bt_ctf_field_copy(field);
+ if (!copy_field) {
+ fprintf(err, "[error] %s in %s:%d\n", __func__,
+ __FILE__, __LINE__);
+ goto error;
+ }
ret = bt_ctf_event_set_event_context(writer_event, copy_field);
if (ret < 0) {
fprintf(err, "[error] %s in %s:%d\n", __func__,
goto error;
}
BT_PUT(copy_field);
+ BT_PUT(field);
}
- BT_PUT(field);
field = bt_ctf_event_get_event_payload(event);
if (!field) {