Fix: Check integer signedness in packet header when auto-populating
[babeltrace.git] / formats / ctf / ir / stream.c
index ce909bf4535696df0af262272d16159048519c9e..45f875ff641ff7a2b0efaedbb1591b9ad4e59432 100644 (file)
@@ -283,6 +283,7 @@ int bt_ctf_stream_append_event(struct bt_ctf_stream *stream,
                goto end;
        }
 
+       /* Make sure the event's payload is set */
        ret = bt_ctf_event_validate(event);
        if (ret) {
                goto end;
@@ -329,10 +330,10 @@ struct bt_ctf_field *bt_ctf_stream_get_packet_context(
        }
 
        packet_context = stream->packet_context;
-end:
        if (packet_context) {
                bt_ctf_field_get(packet_context);
        }
+end:
        return packet_context;
 }
 
@@ -628,6 +629,7 @@ int set_structure_field_integer(struct bt_ctf_field *structure, char *name,
                uint64_t value)
 {
        int ret = 0;
+       struct bt_ctf_field_type *field_type = NULL;
        struct bt_ctf_field *integer =
                bt_ctf_field_structure_get_field(structure, name);
 
@@ -647,8 +649,31 @@ int set_structure_field_integer(struct bt_ctf_field *structure, char *name,
                goto end;
        }
 
-       ret = bt_ctf_field_unsigned_integer_set_value(integer, value);
+       field_type = bt_ctf_field_get_type(integer);
+       /* Something is serioulsly wrong */
+       assert(field_type);
+       if (bt_ctf_field_type_get_type_id(field_type) != CTF_TYPE_INTEGER) {
+               /*
+                * The user most likely meant for us to populate this field
+                * automatically. However, we can only do this if the field
+                * is an integer. Return an error.
+                */
+               ret = -1;
+               goto end;
+       }
+
+       if (bt_ctf_field_type_integer_get_signed(field_type)) {
+               ret = bt_ctf_field_signed_integer_set_value(integer,
+                       (int64_t) value);
+       } else {
+               ret = bt_ctf_field_unsigned_integer_set_value(integer, value);
+       }
 end:
-       bt_ctf_field_put(integer);
+       if (integer) {
+               bt_ctf_field_put(integer);
+       }
+       if (field_type) {
+               bt_ctf_field_type_put(field_type);
+       }
        return ret;
 }
This page took 0.026309 seconds and 4 git commands to generate.