Fix: bad check of accept() return value
[lttng-tools.git] / src / common / consumer.c
index e0a756a5697c40c7cbbd1ff0887a5c01f61464e3..1045bfb46101d8a6bb63a8c91157f3ffbf5199a2 100644 (file)
@@ -1106,7 +1106,7 @@ void lttng_consumer_should_exit(struct lttng_consumer_local_data *ctx)
        do {
                ret = write(ctx->consumer_should_quit[1], "4", 1);
        } while (ret < 0 && errno == EINTR);
-       if (ret < 0) {
+       if (ret < 0 || ret != 1) {
                PERROR("write consumer quit");
        }
 
@@ -1324,7 +1324,7 @@ static int write_relayd_metadata_id(int fd,
        do {
                ret = write(fd, (void *) &hdr, sizeof(hdr));
        } while (ret < 0 && errno == EINTR);
-       if (ret < 0) {
+       if (ret < 0 || ret != sizeof(hdr)) {
                /*
                 * This error means that the fd's end is closed so ignore the perror
                 * not to clubber the error output since this can happen in a normal
@@ -1334,6 +1334,12 @@ static int write_relayd_metadata_id(int fd,
                        PERROR("write metadata stream id");
                }
                DBG3("Consumer failed to write relayd metadata id (errno: %d)", errno);
+               /*
+                * Set ret to a negative value because if ret != sizeof(hdr), we don't
+                * handle writting the missing part so report that as an error and
+                * don't lie to the caller.
+                */
+               ret = -1;
                goto end;
        }
        DBG("Metadata stream id %" PRIu64 " with padding %lu written before data",
@@ -2597,7 +2603,7 @@ void *consumer_thread_sessiond_poll(void *data)
 
        /* Blocking call, waiting for transmission */
        sock = lttcomm_accept_unix_sock(client_socket);
-       if (sock <= 0) {
+       if (sock < 0) {
                WARN("On accept");
                goto end;
        }
@@ -2759,6 +2765,7 @@ int consumer_add_relayd_socket(int net_seq_idx, int sock_type,
                relayd = consumer_allocate_relayd_sock_pair(net_seq_idx);
                if (relayd == NULL) {
                        lttng_consumer_send_error(ctx, LTTCOMM_CONSUMERD_OUTFD_ERROR);
+                       ret = -1;
                        goto error;
                }
                relayd->sessiond_session_id = (uint64_t) sessiond_id;
@@ -2808,11 +2815,17 @@ int consumer_add_relayd_socket(int net_seq_idx, int sock_type,
                relayd->control_sock.fd = fd;
 
                /*
-                * Create a session on the relayd and store the returned id. No need to
-                * grab the socket lock since the relayd object is not yet visible.
+                * Create a session on the relayd and store the returned id. Lock the
+                * control socket mutex if the relayd was NOT created before.
                 */
+               if (!relayd_created) {
+                       pthread_mutex_lock(&relayd->ctrl_sock_mutex);
+               }
                ret = relayd_create_session(&relayd->control_sock,
                                &relayd->relayd_session_id);
+               if (!relayd_created) {
+                       pthread_mutex_unlock(&relayd->ctrl_sock_mutex);
+               }
                if (ret < 0) {
                        goto error;
                }
@@ -2821,6 +2834,7 @@ int consumer_add_relayd_socket(int net_seq_idx, int sock_type,
                relayd_id_node = zmalloc(sizeof(struct consumer_relayd_session_id));
                if (!relayd_id_node) {
                        PERROR("zmalloc relayd id node");
+                       ret = -1;
                        goto error;
                }
 
@@ -2855,6 +2869,7 @@ int consumer_add_relayd_socket(int net_seq_idx, int sock_type,
                break;
        default:
                ERR("Unknown relayd socket type (%d)", sock_type);
+               ret = -1;
                goto error;
        }
 
This page took 0.023816 seconds and 4 git commands to generate.