Fix: partial recv lead to client disconnect
[lttng-tools.git] / src / common / unix.c
index 222b4a3d9ab2c874da7add2b4c9a02832661da6b..df92b7a0698ef699ed31a5bbc82b6741362cedfb 100644 (file)
@@ -210,6 +210,9 @@ ssize_t lttcomm_recv_unix_sock(int sock, void *buf, size_t len)
  * Receive data of size len in put that data into the buf param. Using recvmsg
  * API. Only use with sockets set in non-blocking mode.
  *
+ * NOTE: EPIPE errors are NOT reported. This call expects the socket to be in a
+ * poll set. The poll loop will handle the EPIPE original cause.
+ *
  * Return the size of received data.
  */
 LTTNG_HIDDEN
@@ -233,13 +236,20 @@ retry:
                        goto retry;
                } else {
                        /*
-                        * Only warn about EPIPE when quiet mode is
-                        * deactivated.
-                        * We consider EPIPE as expected.
+                        * We consider EPIPE and EAGAIN/EWOULDBLOCK as expected.
                         */
-                       if (errno != EPIPE || !lttng_opt_quiet) {
-                               PERROR("recvmsg");
+                       if (errno == EAGAIN || errno == EWOULDBLOCK ||
+                                       errno == EPIPE) {
+                               /*
+                                * Nothing was recv.
+                                */
+                               ret = 0;
+                               goto end;
                        }
+
+                       /* Unexpected error */
+                       PERROR("recvmsg");
+                       ret = -1;
                        goto end;
                }
        }
@@ -298,6 +308,9 @@ end:
  * of the function is that this one does not retry to send on partial sends,
  * except if the interruption was caused by a signal (EINTR).
  *
+ * NOTE: EPIPE errors are NOT reported. This call expects the socket to be in a
+ * poll set. The poll loop will handle the EPIPE original cause.
+ *
  * Return the size of sent data.
  */
 LTTNG_HIDDEN
@@ -321,13 +334,21 @@ retry:
                        goto retry;
                } else {
                        /*
-                        * Only warn about EPIPE when quiet mode is
-                        * deactivated.
-                        * We consider EPIPE as expected.
+                        * We consider EPIPE and EAGAIN/EWOULDBLOCK as expected.
                         */
-                       if (errno != EPIPE || !lttng_opt_quiet) {
-                               PERROR("sendmsg");
+                       if (errno == EAGAIN || errno == EWOULDBLOCK ||
+                                       errno == EPIPE) {
+                               /*
+                                * This can happen in non blocking mode.
+                                * Nothing was sent.
+                                */
+                               ret = 0;
+                               goto end;
                        }
+
+                       /* Unexpected error */
+                       PERROR("sendmsg");
+                       ret = -1;
                        goto end;
                }
        }
This page took 0.024347 seconds and 4 git commands to generate.