Fix: relayd viewer stream: unhandled out of memory error
[lttng-tools.git] / src / bin / lttng-relayd / viewer-stream.c
index a16f331b8f795607389a1efa2c20263ac7609b6f..37486293f8e8b5df965b2054978cee3aa3b46566 100644 (file)
@@ -17,6 +17,7 @@
  */
 
 #define _GNU_SOURCE
+#define _LGPL_SOURCE
 #include <common/common.h>
 #include <common/index/index.h>
 
@@ -57,17 +58,25 @@ struct relay_viewer_stream *viewer_stream_create(struct relay_stream *stream,
        vstream->session_id = stream->session_id;
        vstream->stream_handle = stream->stream_handle;
        vstream->path_name = strndup(stream->path_name, LTTNG_VIEWER_PATH_MAX);
+       if (vstream->path_name == NULL) {
+               PERROR("relay viewer path_name alloc");
+               goto error;
+       }
        vstream->channel_name = strndup(stream->channel_name,
                        LTTNG_VIEWER_NAME_MAX);
+       if (vstream->channel_name == NULL) {
+               PERROR("relay viewer channel_name alloc");
+               goto error;
+       }
        vstream->tracefile_count = stream->tracefile_count;
        vstream->metadata_flag = stream->metadata_flag;
        vstream->tracefile_count_last = -1ULL;
 
        switch (seek_t) {
-       case VIEWER_SEEK_BEGINNING:
+       case LTTNG_VIEWER_SEEK_BEGINNING:
                vstream->tracefile_count_current = stream->oldest_tracefile_id;
                break;
-       case VIEWER_SEEK_LAST:
+       case LTTNG_VIEWER_SEEK_LAST:
                vstream->tracefile_count_current = stream->tracefile_count_current;
                break;
        default:
@@ -112,7 +121,7 @@ struct relay_viewer_stream *viewer_stream_create(struct relay_stream *stream,
                vstream->index_read_fd = read_fd;
        }
 
-       if (seek_t == VIEWER_SEEK_LAST && vstream->index_read_fd >= 0) {
+       if (seek_t == LTTNG_VIEWER_SEEK_LAST && vstream->index_read_fd >= 0) {
                off_t lseek_ret;
 
                lseek_ret = lseek(vstream->index_read_fd,
@@ -196,6 +205,7 @@ end:
 /*
  * Rotate a stream to the next tracefile.
  *
+ * Must be called with viewer_stream_rotation_lock held.
  * Returns 0 on success, 1 on EOF, a negative value on error.
  */
 int viewer_stream_rotate(struct relay_viewer_stream *vstream,
@@ -224,12 +234,6 @@ int viewer_stream_rotate(struct relay_viewer_stream *vstream,
                goto end;
        }
 
-       /*
-        * Lock to execute rotation in order to avoid races between a modification
-        * on the index values.
-        */
-       pthread_mutex_lock(&stream->viewer_stream_rotation_lock);
-
        /*
         * The writer and the reader are not working in the same tracefile, we can
         * read up to EOF, we don't care about the total_index_received.
@@ -264,8 +268,6 @@ int viewer_stream_rotate(struct relay_viewer_stream *vstream,
        vstream->abort_flag = 0;
        pthread_mutex_unlock(&vstream->overwrite_lock);
 
-       pthread_mutex_unlock(&stream->viewer_stream_rotation_lock);
-
        ret = index_open(vstream->path_name, vstream->channel_name,
                        vstream->tracefile_count, vstream->tracefile_count_current);
        if (ret < 0) {
This page took 0.024272 seconds and 4 git commands to generate.