Fix: unprivilieged sessiond agent port clashes with root sessiond
[lttng-tools.git] / src / bin / lttng-relayd / live.c
index 9029a5955a4ad2a4f7551fb033e371914b905bee..ea3e8fb00c224305289f3f7de8308820933003ed 100644 (file)
@@ -452,10 +452,11 @@ struct lttcomm_sock *init_socket(struct lttng_uri *uri)
        if (ret < 0) {
                goto error;
        }
-       DBG("Listening on sock %d for live", sock->fd);
+       DBG("Listening on sock %d for lttng-live", sock->fd);
 
        ret = sock->ops->bind(sock);
        if (ret < 0) {
+               PERROR("Failed to bind lttng-live socket");
                goto error;
        }
 
@@ -1483,12 +1484,12 @@ static
 int viewer_get_packet(struct relay_connection *conn)
 {
        int ret;
-       char *data = NULL;
+       off_t lseek_ret;
+       char *reply = NULL;
        struct lttng_viewer_get_packet get_packet_info;
-       struct lttng_viewer_trace_packet reply;
+       struct lttng_viewer_trace_packet reply_header;
        struct relay_viewer_stream *vstream = NULL;
-       bool skip_send_data = false;
-       uint32_t send_len = sizeof(reply);
+       uint32_t reply_size = sizeof(reply_header);
        uint32_t packet_data_len = 0;
        ssize_t read_len;
 
@@ -1504,39 +1505,36 @@ int viewer_get_packet(struct relay_connection *conn)
        health_code_update();
 
        /* From this point on, the error label can be reached. */
-       memset(&reply, 0, sizeof(reply));
+       memset(&reply_header, 0, sizeof(reply_header));
 
        vstream = viewer_stream_get_by_id(be64toh(get_packet_info.stream_id));
        if (!vstream) {
-               skip_send_data = true;
                DBG("Client requested packet of unknown stream id %" PRIu64,
                                be64toh(get_packet_info.stream_id));
-               reply.status = htobe32(LTTNG_VIEWER_GET_PACKET_ERR);
+               reply_header.status = htobe32(LTTNG_VIEWER_GET_PACKET_ERR);
+               goto send_reply_nolock;
        } else {
                packet_data_len = be32toh(get_packet_info.len);
-               send_len += packet_data_len;
+               reply_size += packet_data_len;
        }
 
-       data = zmalloc(send_len);
-       if (!data) {
-               PERROR("relay data zmalloc");
+       reply = zmalloc(reply_size);
+       if (!reply) {
+               PERROR("packet reply zmalloc");
+               reply_size = sizeof(reply_header);
                goto error;
        }
 
-       if (skip_send_data) {
-               goto send_reply_nolock;
-       }
-
        pthread_mutex_lock(&vstream->stream->lock);
-       ret = lseek(vstream->stream_fd->fd, be64toh(get_packet_info.offset),
+       lseek_ret = lseek(vstream->stream_fd->fd, be64toh(get_packet_info.offset),
                        SEEK_SET);
-       if (ret < 0) {
+       if (lseek_ret < 0) {
                PERROR("lseek fd %d to offset %" PRIu64, vstream->stream_fd->fd,
                        be64toh(get_packet_info.offset));
                goto error;
        }
        read_len = lttng_read(vstream->stream_fd->fd,
-                       data + sizeof(reply),
+                       reply + sizeof(reply_header),
                        packet_data_len);
        if (read_len < packet_data_len) {
                PERROR("Relay reading trace file, fd: %d, offset: %" PRIu64,
@@ -1544,12 +1542,12 @@ int viewer_get_packet(struct relay_connection *conn)
                                be64toh(get_packet_info.offset));
                goto error;
        }
-       reply.status = htobe32(LTTNG_VIEWER_GET_PACKET_OK);
-       reply.len = htobe32(packet_data_len);
+       reply_header.status = htobe32(LTTNG_VIEWER_GET_PACKET_OK);
+       reply_header.len = htobe32(packet_data_len);
        goto send_reply;
 
 error:
-       reply.status = htobe32(LTTNG_VIEWER_GET_PACKET_ERR);
+       reply_header.status = htobe32(LTTNG_VIEWER_GET_PACKET_ERR);
 
 send_reply:
        if (vstream) {
@@ -1559,20 +1557,26 @@ send_reply_nolock:
 
        health_code_update();
 
-       memcpy(data, &reply, sizeof(reply));
-       health_code_update();
-       ret = send_response(conn->sock, data, send_len);
+       if (reply) {
+               memcpy(reply, &reply_header, sizeof(reply_header));
+               ret = send_response(conn->sock, reply, reply_size);
+       } else {
+               /* No reply to send. */
+               ret = send_response(conn->sock, &reply_header,
+                               reply_size);
+       }
+
        health_code_update();
        if (ret < 0) {
                PERROR("sendmsg of packet data failed");
                goto end_free;
        }
 
-       DBG("Sent %u bytes for stream %" PRIu64, send_len,
+       DBG("Sent %u bytes for stream %" PRIu64, reply_size,
                        be64toh(get_packet_info.stream_id));
 
 end_free:
-       free(data);
+       free(reply);
 end:
        if (vstream) {
                viewer_stream_put(vstream);
This page took 0.025287 seconds and 4 git commands to generate.