consumer relayd interaction: fix segfaults
[lttng-tools.git] / src / common / relayd / relayd.c
index 82bcf5ff6103275a23f22a8d0c47de20195f70c0..2283865cf0d86be6c905baa287fd5809f17af8f2 100644 (file)
@@ -41,6 +41,10 @@ static int send_command(struct lttcomm_relayd_sock *rsock,
        char *buf;
        uint64_t buf_size = sizeof(header);
 
+       if (rsock->sock.fd < 0) {
+               return -ECONNRESET;
+       }
+
        if (data) {
                buf_size += size;
        }
@@ -87,7 +91,11 @@ static int recv_reply(struct lttcomm_relayd_sock *rsock, void *data, size_t size
 {
        int ret;
 
-       DBG3("Relayd waiting for reply of size %ld", size);
+       if (rsock->sock.fd < 0) {
+               return -ECONNRESET;
+       }
+
+       DBG3("Relayd waiting for reply of size %zu", size);
 
        ret = rsock->sock.ops->recvmsg(&rsock->sock, data, size, 0);
        if (ret <= 0 || ret != size) {
@@ -95,7 +103,7 @@ static int recv_reply(struct lttcomm_relayd_sock *rsock, void *data, size_t size
                        /* Orderly shutdown. */
                        DBG("Socket %d has performed an orderly shutdown", rsock->sock.fd);
                } else {
-                       DBG("Receiving reply failed on sock %d for size %lu with ret %d",
+                       DBG("Receiving reply failed on sock %d for size %zu with ret %d",
                                        rsock->sock.fd, size, ret);
                }
                /* Always return -1 here and the caller can use errno. */
@@ -337,6 +345,13 @@ int relayd_connect(struct lttcomm_relayd_sock *rsock)
        /* Code flow error. Safety net. */
        assert(rsock);
 
+       if (!rsock->sock.ops) {
+               /*
+                * Attempting a connect on a non-initialized socket.
+                */
+               return -ECONNRESET;
+       }
+
        DBG3("Relayd connect ...");
 
        return rsock->sock.ops->connect(&rsock->sock);
@@ -379,6 +394,7 @@ int relayd_close(struct lttcomm_relayd_sock *rsock)
                        PERROR("relayd_close default close");
                }
        }
+       rsock->sock.fd = -1;
 
 end:
        return ret;
@@ -396,7 +412,11 @@ int relayd_send_data_hdr(struct lttcomm_relayd_sock *rsock,
        assert(rsock);
        assert(hdr);
 
-       DBG3("Relayd sending data header of size %ld", size);
+       if (rsock->sock.fd < 0) {
+               return -ECONNRESET;
+       }
+
+       DBG3("Relayd sending data header of size %zu", size);
 
        /* Again, safety net */
        if (size == 0) {
This page took 0.023211 seconds and 4 git commands to generate.