Fix: dereference after null check
[babeltrace.git] / lib / ctf-ir / stream.c
index 8145eb718814c740736c28d17fd6ce7f640b7c2c..4ce2fe3016dce3957c4d078cf7c3e194f268bc87 100644 (file)
@@ -667,46 +667,73 @@ int create_stream_file(struct bt_ctf_writer *writer,
                struct bt_ctf_stream *stream)
 {
        int fd;
-       GString *filename = g_string_new(stream->stream_class->name->str);
-       char *file_path;
+       GString *filename = g_string_new(NULL);
+       int64_t stream_class_id;
+       char *file_path = NULL;
 
        BT_LOGD("Creating stream file: writer-addr=%p, stream-addr=%p, "
                "stream-name=\"%s\", stream-class-addr=%p, stream-class-name=\"%s\"",
                writer, stream, bt_ctf_stream_get_name(stream),
                stream->stream_class, stream->stream_class->name->str);
 
-       if (stream->stream_class->name->len == 0) {
-               int64_t ret;
-
-               ret = bt_ctf_stream_class_get_id(stream->stream_class);
-               if (ret < 0) {
-                       BT_LOGW("Cannot get stream class's ID: "
-                               "stream-class-addr=%p, "
-                               "stream-class-name=\"%s\"",
-                               stream->stream_class,
-                               stream->stream_class->name->str);
-                       fd = -1;
-                       goto end;
+       if (stream->name && stream->name->len > 0) {
+               /* Use stream name's base name as prefix */
+               gchar *basename = g_path_get_basename(stream->name->str);
+
+               assert(basename);
+
+               if (strcmp(basename, G_DIR_SEPARATOR_S) == 0) {
+                       g_string_assign(filename, "stream");
+               } else {
+                       g_string_assign(filename, basename);
                }
 
-               g_string_printf(filename, "stream_%" PRId64, ret);
+               g_free(basename);
+               goto append_ids;
        }
 
-       g_string_append_printf(filename, "_%" PRId64, stream->id);
+       if (stream->stream_class->name &&
+                       stream->stream_class->name->len > 0) {
+               /* Use stream class name's base name as prefix */
+               gchar *basename =
+                       g_path_get_basename(stream->stream_class->name->str);
+
+               assert(basename);
+
+               if (strcmp(basename, G_DIR_SEPARATOR_S) == 0) {
+                       g_string_assign(filename, "stream");
+               } else {
+                       g_string_assign(filename, basename);
+               }
+
+               g_free(basename);
+               goto append_ids;
+       }
+
+       /* Default to using `stream-` as prefix */
+       g_string_assign(filename, "stream");
+
+append_ids:
+       stream_class_id = bt_ctf_stream_class_get_id(stream->stream_class);
+       assert(stream_class_id >= 0);
+       assert(stream->id >= 0);
+       g_string_append_printf(filename, "-%" PRId64 "-%" PRId64,
+               stream_class_id, stream->id);
+
        file_path = g_build_filename(writer->path->str, filename->str, NULL);
        if (file_path == NULL) {
                fd = -1;
                goto end;
        }
+
        fd = open(file_path,
                O_RDWR | O_CREAT | O_TRUNC,
                S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
        g_free(file_path);
        if (fd < 0) {
-               BT_LOGW("Failed to open stream file for writing: %s: "
-                       "filename=\"%s\", "
-                       "ret=%d, errno=%d", strerror(errno),
-                       filename->str, fd, errno);
+               BT_LOGW_ERRNO("Failed to open stream file for writing",
+                       ": file_path=\"%s\", filename=\"%s\", ret=%d",
+                       file_path, filename->str, fd);
                goto end;
        }
 
@@ -1129,7 +1156,7 @@ static int auto_populate_event_header(struct bt_ctf_stream *stream,
        int ret = 0;
        struct bt_ctf_field *id_field = NULL, *timestamp_field = NULL;
        struct bt_ctf_clock_class *mapped_clock_class = NULL;
-       uint64_t event_class_id;
+       int64_t event_class_id;
 
        assert(event);
 
@@ -1148,8 +1175,12 @@ static int auto_populate_event_header(struct bt_ctf_stream *stream,
                stream, bt_ctf_stream_get_name(stream), event);
 
        id_field = bt_ctf_field_structure_get_field(event->event_header, "id");
-       event_class_id = (uint64_t) bt_ctf_event_class_get_id(event->event_class);
-       assert(event_class_id >= 0);
+       event_class_id = bt_ctf_event_class_get_id(event->event_class);
+       if (event_class_id < 0) {
+               BT_LOGE("Event class ID cannot be found");
+               ret = -1;
+               goto end;
+       }
        if (id_field && bt_ctf_field_type_is_integer(id_field->type)) {
                ret = set_integer_field_value(id_field, event_class_id);
                if (ret) {
@@ -1480,7 +1511,7 @@ int bt_ctf_stream_flush(struct bt_ctf_stream *stream)
        if (!stream) {
                BT_LOGW_STR("Invalid parameter: stream is NULL.");
                ret = -1;
-               goto end;
+               goto end_no_stream;
        }
 
        if (stream->pos.fd < 0) {
@@ -1718,6 +1749,8 @@ end:
                        "packet-size=%" PRIu64,
                        stream->pos.offset, stream->pos.packet_size);
        }
+
+end_no_stream:
        return ret;
 }
 
@@ -1767,16 +1800,14 @@ void bt_ctf_stream_destroy(struct bt_object *obj)
                        ret = ftruncate(stream->pos.fd, stream->size);
                } while (ret == -1 && errno == EINTR);
                if (ret) {
-                       BT_LOGE("Failed to truncate stream file: %s: "
-                               "ret=%d, errno=%d, size=%" PRIu64,
-                               strerror(errno), ret, errno,
-                               (uint64_t) stream->size);
+                       BT_LOGE_ERRNO("Failed to truncate stream file",
+                               ": ret=%d, size=%" PRIu64,
+                               ret, (uint64_t) stream->size);
                }
 
                if (close(stream->pos.fd)) {
-                       BT_LOGE("Failed to close stream file: %s: "
-                               "ret=%d, errno=%d", strerror(errno),
-                               ret, errno);
+                       BT_LOGE_ERRNO("Failed to close stream file",
+                               ": ret=%d", ret);
                }
        }
 
This page took 0.024625 seconds and 4 git commands to generate.