Fix: relayd metadata size
[lttng-tools.git] / src / bin / lttng-relayd / main.c
index abefba8659d7cc429aa39588186e580de084d51b..1ef6881c09f8c4e63efab37f257f5869e80ba1ab 100644 (file)
@@ -1070,8 +1070,14 @@ int relay_recv_metadata(struct lttcomm_relayd_hdr *recv_hdr,
                goto end;
        }
 
-       data_size = be64toh(recv_hdr->data_size);
-       payload_size = data_size - sizeof(uint64_t);
+       data_size = payload_size = be64toh(recv_hdr->data_size);
+       if (data_size < sizeof(struct lttcomm_relayd_metadata_payload)) {
+               ERR("Incorrect data size");
+               ret = -1;
+               goto end;
+       }
+       payload_size -= sizeof(struct lttcomm_relayd_metadata_payload);
+
        if (data_buffer_size < data_size) {
                data_buffer = realloc(data_buffer, data_size);
                if (!data_buffer) {
@@ -1083,7 +1089,8 @@ int relay_recv_metadata(struct lttcomm_relayd_hdr *recv_hdr,
        }
        memset(data_buffer, 0, data_size);
        DBG2("Relay receiving metadata, waiting for %lu bytes", data_size);
-       ret = cmd->sock->ops->recvmsg(cmd->sock, data_buffer, data_size, MSG_WAITALL);
+       ret = cmd->sock->ops->recvmsg(cmd->sock, data_buffer, data_size,
+                       MSG_WAITALL);
        if (ret < 0 || ret != data_size) {
                ret = -1;
                ERR("Relay didn't receive the whole metadata");
@@ -1103,7 +1110,7 @@ int relay_recv_metadata(struct lttcomm_relayd_hdr *recv_hdr,
                ret = write(metadata_stream->fd, metadata_struct->payload,
                                payload_size);
        } while (ret < 0 && errno == EINTR);
-       if (ret < (payload_size)) {
+       if (ret < payload_size) {
                ERR("Relay error writing metadata on file");
                ret = -1;
                goto end_unlock;
@@ -1234,6 +1241,7 @@ int relay_process_data(struct relay_command *cmd, struct lttng_ht *streams_ht)
        }
        memset(data_buffer, 0, data_size);
 
+       DBG3("Receiving data of size %u for stream id %zu", data_size, stream_id);
        ret = cmd->sock->ops->recvmsg(cmd->sock, data_buffer, data_size, MSG_WAITALL);
        if (ret <= 0) {
                ret = -1;
@@ -1377,6 +1385,7 @@ void *relay_thread_worker(void *data)
 
                /* Infinite blocking call, waiting for transmission */
        restart:
+               DBG3("Relayd worker thread polling...");
                ret = lttng_poll_wait(&events, -1);
                if (ret < 0) {
                        /*
This page took 0.024124 seconds and 4 git commands to generate.