relayd: fix: rotate_truncate_stream() assumes non-null next chunk
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Wed, 11 Sep 2019 16:03:38 +0000 (12:03 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 19 Sep 2019 19:31:48 +0000 (15:31 -0400)
While the protocol doesn't allow a stream rotation position in the
past when rotating to a "NULL" trace chunk, a misbehaving peer could
express this. Report the protocol error and abort the truncation
operation in this case.

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/bin/lttng-relayd/stream.c

index f98b465572ec880d4730224da7766fe4ce7fc040..06e82b29198a082476c34b5d215cc3a083ad14bf 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.
This page took 0.033863 seconds and 4 git commands to generate.