From c5c82c6e43e08d5afa93cd9d8de47447513fab42 Mon Sep 17 00:00:00 2001 From: Philippe Proulx Date: Tue, 16 May 2017 17:18:55 -0400 Subject: [PATCH] Fix: set no field in event/packet without warnings or failing 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 --- lib/ctf-ir/event.c | 112 +++++++++++++++++++++++++++++++------------- lib/ctf-ir/packet.c | 36 ++++++++++---- 2 files changed, 106 insertions(+), 42 deletions(-) diff --git a/lib/ctf-ir/event.c b/lib/ctf-ir/event.c index 005173e6..f61454e9 100644 --- a/lib/ctf-ir/event.c +++ b/lib/ctf-ir/event.c @@ -495,17 +495,32 @@ int bt_ctf_event_set_header(struct bt_ctf_event *event, * Ensure the provided header's type matches the one registered to the * stream class. */ - field_type = bt_ctf_field_get_type(header); - if (bt_ctf_field_type_compare(field_type, - stream_class->event_header_type)) { - BT_LOGW("Invalid parameter: header field type is different from the expected field type: " - "event-addr=%p, event-class-name=\"%s\", " - "event-class-id=%" PRId64, - event, - bt_ctf_event_class_get_name(event->event_class), - bt_ctf_event_class_get_id(event->event_class)); - ret = -1; - goto end; + if (header) { + field_type = bt_ctf_field_get_type(header); + if (bt_ctf_field_type_compare(field_type, + stream_class->event_header_type)) { + BT_LOGW("Invalid parameter: header field type is different from the expected field type: " + "event-addr=%p, event-class-name=\"%s\", " + "event-class-id=%" PRId64, + event, + bt_ctf_event_class_get_name(event->event_class), + bt_ctf_event_class_get_id(event->event_class)); + ret = -1; + goto end; + } + } else { + if (stream_class->event_header_type) { + BT_LOGW("Invalid parameter: setting no event header but event header field type is not NULL: " + "event-addr=%p, event-class-name=\"%s\", " + "event-class-id=%" PRId64 ", " + "event-header-ft-addr=%p", + event, + bt_ctf_event_class_get_name(event->event_class), + bt_ctf_event_class_get_id(event->event_class), + stream_class->event_header_type); + ret = -1; + goto end; + } } bt_put(event->event_header); @@ -566,17 +581,33 @@ int bt_ctf_event_set_event_context(struct bt_ctf_event *event, goto end; } - field_type = bt_ctf_field_get_type(context); - if (bt_ctf_field_type_compare(field_type, - event->event_class->context)) { - BT_LOGW("Invalid parameter: context field type is different from the expected field type: " - "event-addr=%p, event-class-name=\"%s\", " - "event-class-id=%" PRId64, - event, - bt_ctf_event_class_get_name(event->event_class), - bt_ctf_event_class_get_id(event->event_class)); - ret = -1; - goto end; + if (context) { + field_type = bt_ctf_field_get_type(context); + + if (bt_ctf_field_type_compare(field_type, + event->event_class->context)) { + BT_LOGW("Invalid parameter: context field type is different from the expected field type: " + "event-addr=%p, event-class-name=\"%s\", " + "event-class-id=%" PRId64, + event, + bt_ctf_event_class_get_name(event->event_class), + bt_ctf_event_class_get_id(event->event_class)); + ret = -1; + goto end; + } + } else { + if (event->event_class->context) { + BT_LOGW("Invalid parameter: setting no event context but event context field type is not NULL: " + "event-addr=%p, event-class-name=\"%s\", " + "event-class-id=%" PRId64 ", " + "event-context-ft-addr=%p", + event, + bt_ctf_event_class_get_name(event->event_class), + bt_ctf_event_class_get_id(event->event_class), + event->event_class->context); + ret = -1; + goto end; + } } bt_put(event->context_payload); @@ -643,17 +674,32 @@ int bt_ctf_event_set_stream_event_context(struct bt_ctf_event *event, */ assert(stream_class); - field_type = bt_ctf_field_get_type(stream_event_context); - if (bt_ctf_field_type_compare(field_type, - stream_class->event_context_type)) { - BT_LOGW("Invalid parameter: stream event context field type is different from the expected field type: " - "event-addr=%p, event-class-name=\"%s\", " - "event-class-id=%" PRId64, - event, - bt_ctf_event_class_get_name(event->event_class), - bt_ctf_event_class_get_id(event->event_class)); - ret = -1; - goto end; + if (stream_event_context) { + field_type = bt_ctf_field_get_type(stream_event_context); + if (bt_ctf_field_type_compare(field_type, + stream_class->event_context_type)) { + BT_LOGW("Invalid parameter: stream event context field type is different from the expected field type: " + "event-addr=%p, event-class-name=\"%s\", " + "event-class-id=%" PRId64, + event, + bt_ctf_event_class_get_name(event->event_class), + bt_ctf_event_class_get_id(event->event_class)); + ret = -1; + goto end; + } + } else { + if (stream_class->event_context_type) { + BT_LOGW("Invalid parameter: setting no stream event context but stream event context field type is not NULL: " + "event-addr=%p, event-class-name=\"%s\", " + "event-class-id=%" PRId64 ", " + "stream-event-context-ft-addr=%p", + event, + bt_ctf_event_class_get_name(event->event_class), + bt_ctf_event_class_get_id(event->event_class), + stream_class->event_context_type); + ret = -1; + goto end; + } } bt_get(stream_event_context); diff --git a/lib/ctf-ir/packet.c b/lib/ctf-ir/packet.c index fd31398d..75588149 100644 --- a/lib/ctf-ir/packet.c +++ b/lib/ctf-ir/packet.c @@ -72,17 +72,26 @@ int bt_ctf_packet_set_header(struct bt_ctf_packet *packet, goto end; } - if (!header) { - goto skip_validation; - } - stream_class = bt_ctf_stream_get_class(packet->stream); assert(stream_class); trace = bt_ctf_stream_class_get_trace(stream_class); assert(trace); + expected_header_field_type = bt_ctf_trace_get_packet_header_type(trace); + + if (!header) { + if (expected_header_field_type) { + BT_LOGW("Invalid parameter: setting no packet header but packet header field type is not NULL: " + "packet-addr=%p, packet-header-ft-addr=%p", + packet, expected_header_field_type); + ret = -1; + goto end; + } + + goto skip_validation; + } + header_field_type = bt_ctf_field_get_type(header); assert(header_field_type); - expected_header_field_type = bt_ctf_trace_get_packet_header_type(trace); if (bt_ctf_field_type_compare(header_field_type, expected_header_field_type)) { @@ -135,16 +144,25 @@ int bt_ctf_packet_set_context(struct bt_ctf_packet *packet, goto end; } + stream_class = bt_ctf_stream_get_class(packet->stream); + assert(stream_class); + expected_context_field_type = + bt_ctf_stream_class_get_packet_context_type(stream_class); + if (!context) { + if (expected_context_field_type) { + BT_LOGW("Invalid parameter: setting no packet context but packet context field type is not NULL: " + "packet-addr=%p, packet-context-ft-addr=%p", + packet, expected_context_field_type); + ret = -1; + goto end; + } + goto skip_validation; } - stream_class = bt_ctf_stream_get_class(packet->stream); - assert(stream_class); context_field_type = bt_ctf_field_get_type(context); assert(context_field_type); - expected_context_field_type = - bt_ctf_stream_class_get_packet_context_type(stream_class); if (bt_ctf_field_type_compare(context_field_type, expected_context_field_type)) { -- 2.34.1