Fix: handle invalid ops pointer in relayd_close()
[lttng-tools.git] / src / common / consumer.c
index 935a03d235fee67a32f1f6bd14fa7c9bdf65845d..b7e2e9b715160e01649423ad3ae3810059da8431 100644 (file)
@@ -755,7 +755,7 @@ static int write_relayd_stream_header(struct lttng_consumer_stream *stream,
                 * this next value, 1 should always be substracted in order to compare
                 * the last seen sequence number on the relayd side to the last sent.
                 */
-               data_hdr.net_seq_num = htobe64(stream->next_net_seq_num++);
+               data_hdr.net_seq_num = htobe64(stream->next_net_seq_num);
                /* Other fields are zeroed previously */
 
                ret = relayd_send_data_hdr(&relayd->data_sock, &data_hdr,
@@ -764,6 +764,8 @@ static int write_relayd_stream_header(struct lttng_consumer_stream *stream,
                        goto error;
                }
 
+               ++stream->next_net_seq_num;
+
                /* Set to go on data socket */
                outfd = relayd->data_sock.fd;
        }
@@ -2349,7 +2351,7 @@ void *consumer_thread_data_poll(void *data)
                 * array update over low-priority reads.
                 */
                if (pollfd[nb_fd].revents & (POLLIN | POLLPRI)) {
-                       size_t pipe_readlen;
+                       ssize_t pipe_readlen;
 
                        DBG("consumer_data_pipe wake up");
                        /* Consume 1 byte of pipe data */
@@ -2709,7 +2711,7 @@ int consumer_add_relayd_socket(int net_seq_idx, int sock_type,
                struct pollfd *consumer_sockpoll, struct lttcomm_sock *relayd_sock,
                unsigned int sessiond_id)
 {
-       int fd = -1, ret = -1, relayd_created = 0;
+       int fd = -1, ret = -1, relayd_created = 0, sock_created = 0;
        enum lttng_error_code ret_code = LTTNG_OK;
        struct consumer_relayd_sock_pair *relayd;
 
@@ -2777,6 +2779,8 @@ int consumer_add_relayd_socket(int net_seq_idx, int sock_type,
 
                /* Assign new file descriptor */
                relayd->control_sock.fd = fd;
+               /* Flag that we have successfully created a socket with a valid fd. */
+               sock_created = 1;
 
                /*
                 * Create a session on the relayd and store the returned id. Lock the
@@ -2812,6 +2816,8 @@ int consumer_add_relayd_socket(int net_seq_idx, int sock_type,
 
                /* Assign new file descriptor */
                relayd->data_sock.fd = fd;
+               /* Flag that we have successfully created a socket with a valid fd. */
+               sock_created = 1;
                break;
        default:
                ERR("Unknown relayd socket type (%d)", sock_type);
@@ -2841,9 +2847,11 @@ error:
        }
 
        if (relayd_created) {
-               /* We just want to cleanup. Ignore ret value. */
-               (void) relayd_close(&relayd->control_sock);
-               (void) relayd_close(&relayd->data_sock);
+               if (sock_created) {
+                       /* We just want to close the fd for cleanup. Ignore ret value. */
+                       (void) relayd_close(&relayd->control_sock);
+                       (void) relayd_close(&relayd->data_sock);
+               }
                free(relayd);
        }
 
This page took 0.025558 seconds and 4 git commands to generate.