From: Jonathan Rajotte Date: Tue, 27 Apr 2021 01:09:35 +0000 (-0400) Subject: Fix: data reception is called event when only FDS are expected for reception X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=commitdiff_plain;h=5ca80799d52bad8eb5e77fd34fbaf16f2c655d0e Fix: data reception is called event when only FDS are expected for reception In non blocking mode, the FDs reception code can hit EAGAIN. In such cases, skip the data reception completely when performing the reception. The same behavior could have been implemented with a noop at the `lttcomm_recv_unix_sock_non_block` level when the passed `len` is equal to 0. The handling of it at the notification thread reception level was chosen to be explicit with regards to the expected behaviour and not rely on implicit functionality of `lttcomm_recv_unix_sock_non_block`. While there, augment assertions for code in unix.c Change-Id: I0fa6df1c9630caa6e877a39372bdfd3d3a01b648 Signed-off-by: Jonathan Rajotte Signed-off-by: Jérémie Galarneau --- diff --git a/src/bin/lttng-sessiond/notification-thread-events.c b/src/bin/lttng-sessiond/notification-thread-events.c index 414e5dd8a..655400f94 100644 --- a/src/bin/lttng-sessiond/notification-thread-events.c +++ b/src/bin/lttng-sessiond/notification-thread-events.c @@ -3954,6 +3954,12 @@ int handle_notification_thread_client_in( goto end; } + if (client->communication.inbound.bytes_to_receive == 0 && + client->communication.inbound.fds_to_receive != 0) { + /* Only FDs left to receive. */ + goto receive_fds; + } + offset = client->communication.inbound.payload.buffer.size - client->communication.inbound.bytes_to_receive; if (client->communication.inbound.expect_creds) { @@ -3982,6 +3988,7 @@ int handle_notification_thread_client_in( goto end; } +receive_fds: assert(client->communication.inbound.bytes_to_receive == 0); /* Receive fds. */ diff --git a/src/common/unix.c b/src/common/unix.c index ae2b822af..023bff847 100644 --- a/src/common/unix.c +++ b/src/common/unix.c @@ -181,6 +181,10 @@ ssize_t lttcomm_recv_unix_sock(int sock, void *buf, size_t len) ssize_t ret = -1; size_t len_last; + assert(sock); + assert(buf); + assert(len > 0); + memset(&msg, 0, sizeof(msg)); iov[0].iov_base = buf; @@ -223,6 +227,10 @@ ssize_t lttcomm_recv_unix_sock_non_block(int sock, void *buf, size_t len) struct iovec iov[1]; ssize_t ret; + assert(sock); + assert(buf); + assert(len > 0); + memset(&msg, 0, sizeof(msg)); iov[0].iov_base = buf; @@ -271,6 +279,10 @@ ssize_t lttcomm_send_unix_sock(int sock, const void *buf, size_t len) struct iovec iov[1]; ssize_t ret; + assert(sock); + assert(buf); + assert(len > 0); + memset(&msg, 0, sizeof(msg)); iov[0].iov_base = (void *) buf; @@ -321,6 +333,10 @@ ssize_t lttcomm_send_unix_sock_non_block(int sock, const void *buf, size_t len) struct iovec iov[1]; ssize_t ret; + assert(sock); + assert(buf); + assert(len > 0); + memset(&msg, 0, sizeof(msg)); iov[0].iov_base = (void *) buf; @@ -395,6 +411,10 @@ ssize_t lttcomm_send_fds_unix_sock(int sock, const int *fds, size_t nb_fd) char tmp[CMSG_SPACE(sizeof_fds)]; char dummy = 0; + assert(sock); + assert(fds); + assert(nb_fd > 0); + memset(&msg, 0, sizeof(msg)); memset(tmp, 0, sizeof(tmp)); @@ -525,6 +545,10 @@ ssize_t lttcomm_send_fds_unix_sock_non_block(int sock, const int *fds, size_t nb char tmp[CMSG_SPACE(sizeof_fds)]; char dummy = 0; + assert(sock); + assert(fds); + assert(nb_fd > 0); + memset(&msg, 0, sizeof(msg)); memset(tmp, 0, sizeof(tmp)); @@ -614,6 +638,10 @@ ssize_t lttcomm_recv_fds_unix_sock(int sock, int *fds, size_t nb_fd) struct msghdr msg; char dummy; + assert(sock); + assert(fds); + assert(nb_fd > 0); + memset(&msg, 0, sizeof(msg)); /* Prepare to receive the structures */ @@ -763,6 +791,10 @@ ssize_t _lttcomm_recv_payload_fds_unix_sock(int sock, size_t nb_fd, int default_value = -1; struct lttng_dynamic_array raw_fds; + assert(sock); + assert(payload); + assert(nb_fd > 0); + lttng_dynamic_array_init(&raw_fds, sizeof(int), close_raw_fd); for (i = 0; i < nb_fd; i++) { @@ -829,6 +861,10 @@ ssize_t lttcomm_recv_fds_unix_sock_non_block(int sock, int *fds, size_t nb_fd) struct cmsghdr *cmsg; size_t sizeof_fds = nb_fd * sizeof(int); + assert(sock); + assert(fds); + assert(nb_fd > 0); + #ifdef __linux__ /* Account for the struct ucred cmsg in the buffer size */ #define LTTNG_SOCK_RECV_FDS_BUF_SIZE CMSG_SPACE(sizeof_fds) + CMSG_SPACE(sizeof(struct ucred)) @@ -967,6 +1003,10 @@ ssize_t lttcomm_send_creds_unix_sock(int sock, const void *buf, size_t len) memset(&msg, 0, sizeof(msg)); + assert(sock); + assert(buf); + assert(len > 0); + iov[0].iov_base = (void *) buf; iov[0].iov_len = len; msg.msg_iov = iov; @@ -1025,13 +1065,12 @@ ssize_t lttcomm_recv_creds_unix_sock(int sock, void *buf, size_t len, char anc_buf[CMSG_SPACE(sizeof_cred)]; #endif /* __linux__ */ - memset(&msg, 0, sizeof(msg)); + assert(sock); + assert(buf); + assert(len > 0); + assert(creds); - /* Not allowed */ - if (creds == NULL) { - ret = -1; - goto end; - } + memset(&msg, 0, sizeof(msg)); /* Prepare to receive the structures */ iov[0].iov_base = buf;