Fix: iterator.c BT_SEEK_RESTORE: check return value
[babeltrace.git] / lib / iterator.c
index bcb77d8843b2eca392ebb0517bafd934e3f5bcea..2dbd77c0df1ee1de769401f5e05e7102fd2b7142 100644 (file)
@@ -67,7 +67,7 @@ static int stream_read_event(struct ctf_file_stream *sin)
 /*
  * returns true if a < b, false otherwise.
  */
-int stream_compare(void *a, void *b)
+static int stream_compare(void *a, void *b)
 {
        struct ctf_file_stream *s_a = a, *s_b = b;
 
@@ -192,6 +192,9 @@ int bt_iter_set_pos(struct bt_iter *iter, const struct bt_iter_pos *iter_pos)
        struct trace_collection *tc;
        int i, ret;
 
+       if (!iter || !iter_pos)
+               return -EINVAL;
+
        switch (iter_pos->type) {
        case BT_SEEK_RESTORE:
                if (!iter_pos->u.restore)
@@ -237,7 +240,10 @@ int bt_iter_set_pos(struct bt_iter *iter, const struct bt_iter_pos *iter_pos)
                                stream_pos->cur_index,
                                stream_pos->offset, stream->real_timestamp);
 
-                       stream_read_event(saved_pos->file_stream);
+                       ret = stream_read_event(saved_pos->file_stream);
+                       if (ret != 0) {
+                               goto error;
+                       }
 
                        /* Add to heap */
                        ret = heap_insert(iter->stream_heap,
@@ -349,11 +355,15 @@ error_heap_init:
 struct bt_iter_pos *bt_iter_get_pos(struct bt_iter *iter)
 {
        struct bt_iter_pos *pos;
-       struct trace_collection *tc = iter->ctx->tc;
+       struct trace_collection *tc;
        struct ctf_file_stream *file_stream = NULL, *removed;
        struct ptr_heap iter_heap_copy;
        int ret;
 
+       if (!iter)
+               return NULL;
+
+       tc = iter->ctx->tc;
        pos = g_new0(struct bt_iter_pos, 1);
        pos->type = BT_SEEK_RESTORE;
        pos->u.restore = g_new0(struct bt_saved_pos, 1);
@@ -412,6 +422,9 @@ struct bt_iter_pos *bt_iter_create_time_pos(struct bt_iter *iter,
 {
        struct bt_iter_pos *pos;
 
+       if (!iter)
+               return NULL;
+
        pos = g_new0(struct bt_iter_pos, 1);
        pos->type = BT_SEEK_TIME;
        pos->u.seek_time = timestamp;
@@ -429,6 +442,9 @@ static int babeltrace_filestream_seek(struct ctf_file_stream *file_stream,
 {
        int ret = 0;
 
+       if (!file_stream || !begin_pos)
+               return -EINVAL;
+
        switch (begin_pos->type) {
        case BT_SEEK_CUR:
                /*
@@ -459,6 +475,9 @@ int bt_iter_init(struct bt_iter *iter,
        int i, stream_id;
        int ret = 0;
 
+       if (!iter || !ctx)
+               return -EINVAL;
+
        if (ctx->current_iterator) {
                ret = -1;
                goto error_ctx;
@@ -544,6 +563,9 @@ struct bt_iter *bt_iter_create(struct bt_context *ctx,
        struct bt_iter *iter;
        int ret;
 
+       if (!ctx)
+               return NULL;
+
        iter = g_new0(struct bt_iter, 1);
        ret = bt_iter_init(iter, ctx, begin_pos, end_pos);
        if (ret) {
@@ -555,6 +577,7 @@ struct bt_iter *bt_iter_create(struct bt_context *ctx,
 
 void bt_iter_fini(struct bt_iter *iter)
 {
+       assert(iter);
        if (iter->stream_heap) {
                heap_free(iter->stream_heap);
                g_free(iter->stream_heap);
@@ -565,6 +588,7 @@ void bt_iter_fini(struct bt_iter *iter)
 
 void bt_iter_destroy(struct bt_iter *iter)
 {
+       assert(iter);
        bt_iter_fini(iter);
        g_free(iter);
 }
@@ -574,6 +598,9 @@ int bt_iter_next(struct bt_iter *iter)
        struct ctf_file_stream *file_stream, *removed;
        int ret;
 
+       if (!iter)
+               return -EINVAL;
+
        file_stream = heap_maximum(iter->stream_heap);
        if (!file_stream) {
                /* end of file for all streams */
This page took 0.026424 seconds and 4 git commands to generate.