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 <jonathan.rajotte-julien@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
+ 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) {
offset = client->communication.inbound.payload.buffer.size -
client->communication.inbound.bytes_to_receive;
if (client->communication.inbound.expect_creds) {
assert(client->communication.inbound.bytes_to_receive == 0);
/* Receive fds. */
assert(client->communication.inbound.bytes_to_receive == 0);
/* Receive fds. */
ssize_t ret = -1;
size_t len_last;
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;
memset(&msg, 0, sizeof(msg));
iov[0].iov_base = buf;
struct iovec iov[1];
ssize_t ret;
struct iovec iov[1];
ssize_t ret;
+ assert(sock);
+ assert(buf);
+ assert(len > 0);
+
memset(&msg, 0, sizeof(msg));
iov[0].iov_base = buf;
memset(&msg, 0, sizeof(msg));
iov[0].iov_base = buf;
struct iovec iov[1];
ssize_t ret;
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;
memset(&msg, 0, sizeof(msg));
iov[0].iov_base = (void *) buf;
struct iovec iov[1];
ssize_t ret;
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;
memset(&msg, 0, sizeof(msg));
iov[0].iov_base = (void *) buf;
char tmp[CMSG_SPACE(sizeof_fds)];
char dummy = 0;
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));
memset(&msg, 0, sizeof(msg));
memset(tmp, 0, sizeof(tmp));
char tmp[CMSG_SPACE(sizeof_fds)];
char dummy = 0;
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));
memset(&msg, 0, sizeof(msg));
memset(tmp, 0, sizeof(tmp));
struct msghdr msg;
char dummy;
struct msghdr msg;
char dummy;
+ assert(sock);
+ assert(fds);
+ assert(nb_fd > 0);
+
memset(&msg, 0, sizeof(msg));
/* Prepare to receive the structures */
memset(&msg, 0, sizeof(msg));
/* Prepare to receive the structures */
int default_value = -1;
struct lttng_dynamic_array raw_fds;
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++) {
lttng_dynamic_array_init(&raw_fds, sizeof(int), close_raw_fd);
for (i = 0; i < nb_fd; i++) {
struct cmsghdr *cmsg;
size_t sizeof_fds = nb_fd * sizeof(int);
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))
#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))
memset(&msg, 0, sizeof(msg));
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;
iov[0].iov_base = (void *) buf;
iov[0].iov_len = len;
msg.msg_iov = iov;
char anc_buf[CMSG_SPACE(sizeof_cred)];
#endif /* __linux__ */
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;
/* Prepare to receive the structures */
iov[0].iov_base = buf;