From: Philippe Proulx Date: Mon, 3 Apr 2017 23:28:53 +0000 (-0400) Subject: ir: bt_ctf_event_set_clock_value(): validate clock value's class X-Git-Tag: v2.0.0-pre1~390 X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=commitdiff_plain;h=c9d90a342899db7aa095b06d15728f24b89e9a2b ir: bt_ctf_event_set_clock_value(): validate clock value's class On bt_ctf_event_set_clock_value(): validate that the clock class of a clock value is part of the event's trace object. Signed-off-by: Philippe Proulx Signed-off-by: Jérémie Galarneau --- diff --git a/include/babeltrace/ctf-ir/trace-internal.h b/include/babeltrace/ctf-ir/trace-internal.h index 38c89e7b..d332a581 100644 --- a/include/babeltrace/ctf-ir/trace-internal.h +++ b/include/babeltrace/ctf-ir/trace-internal.h @@ -85,4 +85,8 @@ BT_HIDDEN int bt_ctf_trace_object_modification(struct bt_ctf_object *object, void *trace_ptr); +BT_HIDDEN +bool bt_ctf_trace_has_clock_class(struct bt_ctf_trace *trace, + struct bt_ctf_clock_class *clock_class); + #endif /* BABELTRACE_CTF_IR_TRACE_INTERNAL_H */ diff --git a/lib/ctf-ir/event.c b/lib/ctf-ir/event.c index 6d878fd7..5fd732de 100644 --- a/lib/ctf-ir/event.c +++ b/lib/ctf-ir/event.c @@ -586,15 +586,34 @@ int bt_ctf_event_set_clock_value(struct bt_ctf_event *event, struct bt_ctf_clock_value *value) { int ret = 0; + struct bt_ctf_trace *trace; + struct bt_ctf_stream_class *stream_class; + struct bt_ctf_event_class *event_class; + struct bt_ctf_clock_class *clock_class = NULL; if (!event || !value || event->frozen) { ret = -1; goto end; } - g_hash_table_insert(event->clock_values, - bt_ctf_clock_value_get_class(value), bt_get(value)); + clock_class = bt_ctf_clock_value_get_class(value); + event_class = bt_ctf_event_borrow_event_class(event); + assert(event_class); + stream_class = bt_ctf_event_class_borrow_stream_class(event_class); + assert(stream_class); + trace = bt_ctf_stream_class_borrow_trace(stream_class); + assert(trace); + + if (!bt_ctf_trace_has_clock_class(trace, clock_class)) { + ret = -1; + goto end; + } + + g_hash_table_insert(event->clock_values, clock_class, bt_get(value)); + clock_class = NULL; + end: + bt_put(clock_class); return ret; } diff --git a/lib/ctf-ir/trace.c b/lib/ctf-ir/trace.c index 1b239fa3..99927088 100644 --- a/lib/ctf-ir/trace.c +++ b/lib/ctf-ir/trace.c @@ -389,7 +389,6 @@ int bt_ctf_trace_add_clock_class(struct bt_ctf_trace *trace, struct bt_ctf_clock_class *clock_class) { int ret = 0; - struct search_query query = { .value = clock_class, .found = 0 }; if (!trace || !bt_ctf_clock_class_is_valid(clock_class)) { ret = -1; @@ -397,8 +396,7 @@ int bt_ctf_trace_add_clock_class(struct bt_ctf_trace *trace, } /* Check for duplicate clock classes */ - g_ptr_array_foreach(trace->clocks, value_exists, &query); - if (query.found) { + if (bt_ctf_trace_has_clock_class(trace, clock_class)) { ret = -1; goto end; } @@ -805,6 +803,19 @@ end: return clock_class; } +BT_HIDDEN +bool bt_ctf_trace_has_clock_class(struct bt_ctf_trace *trace, + struct bt_ctf_clock_class *clock_class) +{ + struct search_query query = { .value = clock_class, .found = 0 }; + + assert(trace); + assert(clock_class); + + g_ptr_array_foreach(trace->clocks, value_exists, &query); + return query.found; +} + BT_HIDDEN const char *get_byte_order_string(enum bt_ctf_byte_order byte_order) {