Fix: relayd: Dereference after null check
[lttng-tools.git] / src / bin / lttng-relayd / stream.c
index f98b465572ec880d4730224da7766fe4ce7fc040..3c61e3532e1fd2b810b278f9cb9c5c98391444af 100644 (file)
@@ -210,6 +210,16 @@ static int rotate_truncate_stream(struct relay_stream *stream)
        struct stream_fd *previous_stream_fd = NULL;
        struct lttng_trace_chunk *previous_chunk = NULL;
 
+       if (!LTTNG_OPTIONAL_GET(&stream->ongoing_rotation)->next_trace_chunk) {
+               ERR("Protocol error encoutered in %s(): stream rotation "
+                       "sequence number is before the current sequence number "
+                       "and the next trace chunk is unset. Honoring this "
+                       "rotation command would result in data loss",
+                               __FUNCTION__);
+               ret = -1;
+               goto end;
+       }
+
        ASSERT_LOCKED(stream->lock);
        /*
         * Acquire a reference to the current trace chunk to ensure
@@ -245,6 +255,7 @@ static int rotate_truncate_stream(struct relay_stream *stream)
                goto end;
        }
 
+       assert(stream->stream_fd);
        /*
         * Seek the current tracefile to the position at which the rotation
         * should have occurred.
@@ -1041,6 +1052,7 @@ int stream_update_index(struct relay_stream *stream, uint64_t net_seq_num,
        uint64_t data_offset;
        struct relay_index *index;
 
+       assert(stream->trace_chunk);
        ASSERT_LOCKED(stream->lock);
        /* Get data offset because we are about to update the index. */
        data_offset = htobe64(stream->tracefile_size_current);
@@ -1122,9 +1134,7 @@ int stream_complete_packet(struct relay_stream *stream, size_t packet_total_size
 
        stream->prev_data_seq = sequence_number;
        ret = try_rotate_stream_data(stream);
-       if (ret < 0) {
-               goto end;
-       }
+
 end:
        return ret;
 }
This page took 0.024153 seconds and 4 git commands to generate.