Fix: set no field in event/packet without warnings or failing
authorPhilippe Proulx <eeppeliteloop@gmail.com>
Tue, 16 May 2017 21:18:55 +0000 (17:18 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Sun, 28 May 2017 16:57:43 +0000 (12:57 -0400)
Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
lib/ctf-ir/event.c
lib/ctf-ir/packet.c

index 005173e6c621da6bd771dbfbacff95e300650cfe..f61454e96ccb55a87371aa7498419c005adc3a3f 100644 (file)
@@ -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);
index fd31398dbdb9018a838a7e3a14ff1353b14adb4b..75588149d47d536de587e4f4bf459538dbd1240d 100644 (file)
@@ -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)) {
This page took 0.027147 seconds and 4 git commands to generate.