74b1de
From 2c99b7db00a6238fd43053dd672c8ce519d8fd27 Mon Sep 17 00:00:00 2001
74b1de
From: Xavi Hernandez <xhernandez@redhat.com>
74b1de
Date: Wed, 11 Dec 2019 18:21:14 +0100
74b1de
Subject: [PATCH 341/344] socket: fix error handling
74b1de
74b1de
When __socket_proto_state_machine() detected a problem in the size of
74b1de
the request or it couldn't allocate an iobuf of the requested size, it
74b1de
returned -ENOMEM (-12). However the caller was expecting only -1 in
74b1de
case of error. For this reason the error passes undetected initially,
74b1de
adding back the socket to the epoll object. On further processing,
74b1de
however, the error is finally detected and the connection terminated.
74b1de
Meanwhile, another thread could receive a poll_in event from the same
74b1de
connection, which could cause races with the connection destruction.
74b1de
When this happened, the process crashed.
74b1de
74b1de
To fix this, all error detection conditions have been hardened to be
74b1de
more strict on what is valid and what not. Also, we don't return
74b1de
-ENOMEM anymore. We always return -1 in case of error.
74b1de
74b1de
An additional change has been done to prevent destruction of the
74b1de
transport object while it may still be needed.
74b1de
74b1de
Upstream patch:
74b1de
> Change-Id: I6e59cd81cbf670f7adfdde942625d4e6c3fbc82d
74b1de
> Upstream patch link: https://review.gluster.org/c/glusterfs/+/23861
74b1de
> Fixes: bz#1782495
74b1de
> Signed-off-by: Xavi Hernandez <xhernandez@redhat.com>
74b1de
74b1de
Change-Id: I6e59cd81cbf670f7adfdde942625d4e6c3fbc82d
74b1de
BUG: 1779696
74b1de
Signed-off-by: Xavi Hernandez <xhernandez@redhat.com>
74b1de
Reviewed-on: https://code.engineering.redhat.com/gerrit/187689
74b1de
Tested-by: RHGS Build Bot <nigelb@redhat.com>
74b1de
Reviewed-by: Raghavendra Gowdappa <rgowdapp@redhat.com>
74b1de
---
74b1de
 rpc/rpc-transport/socket/src/socket.c | 173 ++++++++++++++++++----------------
74b1de
 1 file changed, 90 insertions(+), 83 deletions(-)
74b1de
74b1de
diff --git a/rpc/rpc-transport/socket/src/socket.c b/rpc/rpc-transport/socket/src/socket.c
74b1de
index bf2fa71..f54ca83 100644
74b1de
--- a/rpc/rpc-transport/socket/src/socket.c
74b1de
+++ b/rpc/rpc-transport/socket/src/socket.c
74b1de
@@ -173,7 +173,7 @@ ssl_setup_connection_params(rpc_transport_t *this);
74b1de
                                                                                \
74b1de
         ret = __socket_readv(this, in->pending_vector, 1, &in->pending_vector, \
74b1de
                              &in->pending_count, &bytes_read);                 \
74b1de
-        if (ret == -1)                                                         \
74b1de
+        if (ret < 0)                                                           \
74b1de
             break;                                                             \
74b1de
         __socket_proto_update_priv_after_read(priv, ret, bytes_read);          \
74b1de
     }
74b1de
@@ -739,7 +739,7 @@ __socket_rwv(rpc_transport_t *this, struct iovec *vector, int count,
74b1de
                 ret = sys_writev(sock, opvector, IOV_MIN(opcount));
74b1de
             }
74b1de
 
74b1de
-            if (ret == 0 || (ret == -1 && errno == EAGAIN)) {
74b1de
+            if ((ret == 0) || ((ret < 0) && (errno == EAGAIN))) {
74b1de
                 /* done for now */
74b1de
                 break;
74b1de
             } else if (ret > 0)
74b1de
@@ -754,7 +754,7 @@ __socket_rwv(rpc_transport_t *this, struct iovec *vector, int count,
74b1de
                 errno = ENODATA;
74b1de
                 ret = -1;
74b1de
             }
74b1de
-            if (ret == -1 && errno == EAGAIN) {
74b1de
+            if ((ret < 0) && (errno == EAGAIN)) {
74b1de
                 /* done for now */
74b1de
                 break;
74b1de
             } else if (ret > 0)
74b1de
@@ -770,7 +770,7 @@ __socket_rwv(rpc_transport_t *this, struct iovec *vector, int count,
74b1de
             errno = ENOTCONN;
74b1de
             break;
74b1de
         }
74b1de
-        if (ret == -1) {
74b1de
+        if (ret < 0) {
74b1de
             if (errno == EINTR)
74b1de
                 continue;
74b1de
 
74b1de
@@ -907,7 +907,7 @@ __socket_disconnect(rpc_transport_t *this)
74b1de
     gf_log(this->name, GF_LOG_TRACE, "disconnecting %p, sock=%d", this,
74b1de
            priv->sock);
74b1de
 
74b1de
-    if (priv->sock != -1) {
74b1de
+    if (priv->sock >= 0) {
74b1de
         gf_log_callingfn(this->name, GF_LOG_TRACE,
74b1de
                          "tearing down socket connection");
74b1de
         ret = __socket_teardown_connection(this);
74b1de
@@ -942,7 +942,7 @@ __socket_server_bind(rpc_transport_t *this)
74b1de
 
74b1de
     ret = setsockopt(priv->sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
74b1de
 
74b1de
-    if (ret == -1) {
74b1de
+    if (ret != 0) {
74b1de
         gf_log(this->name, GF_LOG_ERROR,
74b1de
                "setsockopt() for SO_REUSEADDR failed (%s)", strerror(errno));
74b1de
     }
74b1de
@@ -955,7 +955,7 @@ __socket_server_bind(rpc_transport_t *this)
74b1de
         if (reuse_check_sock >= 0) {
74b1de
             ret = connect(reuse_check_sock, SA(&unix_addr),
74b1de
                           this->myinfo.sockaddr_len);
74b1de
-            if ((ret == -1) && (ECONNREFUSED == errno)) {
74b1de
+            if ((ret != 0) && (ECONNREFUSED == errno)) {
74b1de
                 sys_unlink(((struct sockaddr_un *)&unix_addr)->sun_path);
74b1de
             }
74b1de
             gf_log(this->name, GF_LOG_INFO,
74b1de
@@ -967,7 +967,7 @@ __socket_server_bind(rpc_transport_t *this)
74b1de
     ret = bind(priv->sock, (struct sockaddr *)&this->myinfo.sockaddr,
74b1de
                this->myinfo.sockaddr_len);
74b1de
 
74b1de
-    if (ret == -1) {
74b1de
+    if (ret != 0) {
74b1de
         gf_log(this->name, GF_LOG_ERROR, "binding to %s failed: %s",
74b1de
                this->myinfo.identifier, strerror(errno));
74b1de
         if (errno == EADDRINUSE) {
74b1de
@@ -976,7 +976,7 @@ __socket_server_bind(rpc_transport_t *this)
74b1de
     }
74b1de
     if (AF_UNIX != SA(&this->myinfo.sockaddr)->sa_family) {
74b1de
         if (getsockname(priv->sock, SA(&this->myinfo.sockaddr),
74b1de
-                        &this->myinfo.sockaddr_len) == -1) {
74b1de
+                        &this->myinfo.sockaddr_len) != 0) {
74b1de
             gf_log(this->name, GF_LOG_WARNING,
74b1de
                    "getsockname on (%d) failed (%s)", priv->sock,
74b1de
                    strerror(errno));
74b1de
@@ -1004,7 +1004,7 @@ __socket_nonblock(int fd)
74b1de
 
74b1de
     flags = fcntl(fd, F_GETFL);
74b1de
 
74b1de
-    if (flags != -1)
74b1de
+    if (flags >= 0)
74b1de
         ret = fcntl(fd, F_SETFL, flags | O_NONBLOCK);
74b1de
 
74b1de
     return ret;
74b1de
@@ -1034,7 +1034,7 @@ __socket_keepalive(int fd, int family, int keepaliveintvl, int keepaliveidle,
74b1de
 #endif
74b1de
 
74b1de
     ret = setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on));
74b1de
-    if (ret == -1) {
74b1de
+    if (ret != 0) {
74b1de
         gf_log("socket", GF_LOG_WARNING,
74b1de
                "failed to set keep alive option on socket %d", fd);
74b1de
         goto err;
74b1de
@@ -1051,7 +1051,7 @@ __socket_keepalive(int fd, int family, int keepaliveintvl, int keepaliveidle,
74b1de
     ret = setsockopt(fd, IPPROTO_TCP, TCP_KEEPALIVE, &keepaliveintvl,
74b1de
                      sizeof(keepaliveintvl));
74b1de
 #endif
74b1de
-    if (ret == -1) {
74b1de
+    if (ret != 0) {
74b1de
         gf_log("socket", GF_LOG_WARNING,
74b1de
                "failed to set keep alive interval on socket %d", fd);
74b1de
         goto err;
74b1de
@@ -1062,7 +1062,7 @@ __socket_keepalive(int fd, int family, int keepaliveintvl, int keepaliveidle,
74b1de
 
74b1de
     ret = setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &keepaliveidle,
74b1de
                      sizeof(keepaliveidle));
74b1de
-    if (ret == -1) {
74b1de
+    if (ret != 0) {
74b1de
         gf_log("socket", GF_LOG_WARNING,
74b1de
                "failed to set keep idle %d on socket %d, %s", keepaliveidle, fd,
74b1de
                strerror(errno));
74b1de
@@ -1070,7 +1070,7 @@ __socket_keepalive(int fd, int family, int keepaliveintvl, int keepaliveidle,
74b1de
     }
74b1de
     ret = setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, &keepaliveintvl,
74b1de
                      sizeof(keepaliveintvl));
74b1de
-    if (ret == -1) {
74b1de
+    if (ret != 0) {
74b1de
         gf_log("socket", GF_LOG_WARNING,
74b1de
                "failed to set keep interval %d on socket %d, %s",
74b1de
                keepaliveintvl, fd, strerror(errno));
74b1de
@@ -1082,7 +1082,7 @@ __socket_keepalive(int fd, int family, int keepaliveintvl, int keepaliveidle,
74b1de
         goto done;
74b1de
     ret = setsockopt(fd, IPPROTO_TCP, TCP_USER_TIMEOUT, &timeout_ms,
74b1de
                      sizeof(timeout_ms));
74b1de
-    if (ret == -1) {
74b1de
+    if (ret != 0) {
74b1de
         gf_log("socket", GF_LOG_WARNING,
74b1de
                "failed to set "
74b1de
                "TCP_USER_TIMEOUT %d on socket %d, %s",
74b1de
@@ -1093,7 +1093,7 @@ __socket_keepalive(int fd, int family, int keepaliveintvl, int keepaliveidle,
74b1de
 #if defined(TCP_KEEPCNT)
74b1de
     ret = setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, &keepalivecnt,
74b1de
                      sizeof(keepalivecnt));
74b1de
-    if (ret == -1) {
74b1de
+    if (ret != 0) {
74b1de
         gf_log("socket", GF_LOG_WARNING,
74b1de
                "failed to set "
74b1de
                "TCP_KEEPCNT %d on socket %d, %s",
74b1de
@@ -1366,7 +1366,7 @@ socket_event_poll_err(rpc_transport_t *this, int gen, int idx)
74b1de
 
74b1de
     pthread_mutex_lock(&priv->out_lock);
74b1de
     {
74b1de
-        if ((priv->gen == gen) && (priv->idx == idx) && (priv->sock != -1)) {
74b1de
+        if ((priv->gen == gen) && (priv->idx == idx) && (priv->sock >= 0)) {
74b1de
             __socket_ioq_flush(this);
74b1de
             __socket_reset(this);
74b1de
             socket_closed = _gf_true;
74b1de
@@ -1405,7 +1405,7 @@ socket_event_poll_out(rpc_transport_t *this)
74b1de
         if (priv->connected == 1) {
74b1de
             ret = __socket_ioq_churn(this);
74b1de
 
74b1de
-            if (ret == -1) {
74b1de
+            if (ret < 0) {
74b1de
                 gf_log(this->name, GF_LOG_TRACE,
74b1de
                        "__socket_ioq_churn returned -1; "
74b1de
                        "disconnecting socket");
74b1de
@@ -1463,7 +1463,7 @@ __socket_read_simple_msg(rpc_transport_t *this)
74b1de
                                      &bytes_read);
74b1de
             }
74b1de
 
74b1de
-            if (ret == -1) {
74b1de
+            if (ret < 0) {
74b1de
                 gf_log(this->name, GF_LOG_WARNING,
74b1de
                        "reading from socket failed. Error (%s), "
74b1de
                        "peer (%s)",
74b1de
@@ -1661,8 +1661,8 @@ __socket_read_vectored_request(rpc_transport_t *this,
74b1de
 
74b1de
             remaining_size = RPC_FRAGSIZE(in->fraghdr) - frag->bytes_read;
74b1de
 
74b1de
-            if ((ret == -1) || ((ret == 0) && (remaining_size == 0) &&
74b1de
-                                RPC_LASTFRAG(in->fraghdr))) {
74b1de
+            if ((ret < 0) || ((ret == 0) && (remaining_size == 0) &&
74b1de
+                              RPC_LASTFRAG(in->fraghdr))) {
74b1de
                 request->vector_state = SP_STATE_VECTORED_REQUEST_INIT;
74b1de
                 in->payload_vector.iov_len = ((unsigned long)frag->fragcurrent -
74b1de
                                               (unsigned long)
74b1de
@@ -1739,8 +1739,8 @@ __socket_read_request(rpc_transport_t *this)
74b1de
 
74b1de
             remaining_size = RPC_FRAGSIZE(in->fraghdr) - frag->bytes_read;
74b1de
 
74b1de
-            if ((ret == -1) || ((ret == 0) && (remaining_size == 0) &&
74b1de
-                                (RPC_LASTFRAG(in->fraghdr)))) {
74b1de
+            if ((ret < 0) || ((ret == 0) && (remaining_size == 0) &&
74b1de
+                              (RPC_LASTFRAG(in->fraghdr)))) {
74b1de
                 request->header_state = SP_STATE_REQUEST_HEADER_INIT;
74b1de
             }
74b1de
 
74b1de
@@ -1870,8 +1870,8 @@ __socket_read_accepted_successful_reply(rpc_transport_t *this)
74b1de
             /* now read the entire remaining msg into new iobuf */
74b1de
             ret = __socket_read_simple_msg(this);
74b1de
             remaining_size = RPC_FRAGSIZE(in->fraghdr) - frag->bytes_read;
74b1de
-            if ((ret == -1) || ((ret == 0) && (remaining_size == 0) &&
74b1de
-                                RPC_LASTFRAG(in->fraghdr))) {
74b1de
+            if ((ret < 0) || ((ret == 0) && (remaining_size == 0) &&
74b1de
+                              RPC_LASTFRAG(in->fraghdr))) {
74b1de
                 frag->call_body.reply.accepted_success_state =
74b1de
                     SP_STATE_ACCEPTED_SUCCESS_REPLY_INIT;
74b1de
             }
74b1de
@@ -2003,8 +2003,8 @@ __socket_read_accepted_successful_reply_v2(rpc_transport_t *this)
74b1de
             /* now read the entire remaining msg into new iobuf */
74b1de
             ret = __socket_read_simple_msg(this);
74b1de
             remaining_size = RPC_FRAGSIZE(in->fraghdr) - frag->bytes_read;
74b1de
-            if ((ret == -1) || ((ret == 0) && (remaining_size == 0) &&
74b1de
-                                RPC_LASTFRAG(in->fraghdr))) {
74b1de
+            if ((ret < 0) || ((ret == 0) && (remaining_size == 0) &&
74b1de
+                              RPC_LASTFRAG(in->fraghdr))) {
74b1de
                 frag->call_body.reply.accepted_success_state =
74b1de
                     SP_STATE_ACCEPTED_SUCCESS_REPLY_INIT;
74b1de
             }
74b1de
@@ -2103,8 +2103,8 @@ __socket_read_accepted_reply(rpc_transport_t *this)
74b1de
 
74b1de
             remaining_size = RPC_FRAGSIZE(in->fraghdr) - frag->bytes_read;
74b1de
 
74b1de
-            if ((ret == -1) || ((ret == 0) && (remaining_size == 0) &&
74b1de
-                                (RPC_LASTFRAG(in->fraghdr)))) {
74b1de
+            if ((ret < 0) || ((ret == 0) && (remaining_size == 0) &&
74b1de
+                              (RPC_LASTFRAG(in->fraghdr)))) {
74b1de
                 frag->call_body.reply
74b1de
                     .accepted_state = SP_STATE_ACCEPTED_REPLY_INIT;
74b1de
             }
74b1de
@@ -2169,8 +2169,8 @@ __socket_read_vectored_reply(rpc_transport_t *this)
74b1de
 
74b1de
             remaining_size = RPC_FRAGSIZE(in->fraghdr) - frag->bytes_read;
74b1de
 
74b1de
-            if ((ret == -1) || ((ret == 0) && (remaining_size == 0) &&
74b1de
-                                (RPC_LASTFRAG(in->fraghdr)))) {
74b1de
+            if ((ret < 0) || ((ret == 0) && (remaining_size == 0) &&
74b1de
+                              (RPC_LASTFRAG(in->fraghdr)))) {
74b1de
                 frag->call_body.reply
74b1de
                     .status_state = SP_STATE_VECTORED_REPLY_STATUS_INIT;
74b1de
                 in->payload_vector.iov_len = (unsigned long)frag->fragcurrent -
74b1de
@@ -2237,7 +2237,7 @@ __socket_read_reply(rpc_transport_t *this)
74b1de
         /* Transition back to externally visible state. */
74b1de
         frag->state = SP_STATE_READ_MSGTYPE;
74b1de
 
74b1de
-        if (ret == -1) {
74b1de
+        if (ret < 0) {
74b1de
             gf_log(this->name, GF_LOG_WARNING,
74b1de
                    "notify for event MAP_XID failed for %s",
74b1de
                    this->peerinfo.identifier);
74b1de
@@ -2315,8 +2315,8 @@ __socket_read_frag(rpc_transport_t *this)
74b1de
 
74b1de
             remaining_size = RPC_FRAGSIZE(in->fraghdr) - frag->bytes_read;
74b1de
 
74b1de
-            if ((ret == -1) || ((ret == 0) && (remaining_size == 0) &&
74b1de
-                                (RPC_LASTFRAG(in->fraghdr)))) {
74b1de
+            if ((ret < 0) || ((ret == 0) && (remaining_size == 0) &&
74b1de
+                              (RPC_LASTFRAG(in->fraghdr)))) {
74b1de
                 /* frag->state = SP_STATE_NADA; */
74b1de
                 frag->state = SP_STATE_RPCFRAG_INIT;
74b1de
             }
74b1de
@@ -2400,7 +2400,7 @@ __socket_proto_state_machine(rpc_transport_t *this,
74b1de
                 ret = __socket_readv(this, in->pending_vector, 1,
74b1de
                                      &in->pending_vector, &in->pending_count,
74b1de
                                      NULL);
74b1de
-                if (ret == -1)
74b1de
+                if (ret < 0)
74b1de
                     goto out;
74b1de
 
74b1de
                 if (ret > 0) {
74b1de
@@ -2422,7 +2422,7 @@ __socket_proto_state_machine(rpc_transport_t *this,
74b1de
                 in->total_bytes_read += RPC_FRAGSIZE(in->fraghdr);
74b1de
 
74b1de
                 if (in->total_bytes_read >= GF_UNIT_GB) {
74b1de
-                    ret = -ENOMEM;
74b1de
+                    ret = -1;
74b1de
                     goto out;
74b1de
                 }
74b1de
 
74b1de
@@ -2430,7 +2430,7 @@ __socket_proto_state_machine(rpc_transport_t *this,
74b1de
                     this->ctx->iobuf_pool,
74b1de
                     (in->total_bytes_read + sizeof(in->fraghdr)));
74b1de
                 if (!iobuf) {
74b1de
-                    ret = -ENOMEM;
74b1de
+                    ret = -1;
74b1de
                     goto out;
74b1de
                 }
74b1de
 
74b1de
@@ -2457,7 +2457,7 @@ __socket_proto_state_machine(rpc_transport_t *this,
74b1de
             case SP_STATE_READING_FRAG:
74b1de
                 ret = __socket_read_frag(this);
74b1de
 
74b1de
-                if ((ret == -1) ||
74b1de
+                if ((ret < 0) ||
74b1de
                     (frag->bytes_read != RPC_FRAGSIZE(in->fraghdr))) {
74b1de
                     goto out;
74b1de
                 }
74b1de
@@ -2575,7 +2575,7 @@ socket_event_poll_in(rpc_transport_t *this, gf_boolean_t notify_handled)
74b1de
         pthread_mutex_unlock(&priv->notify.lock);
74b1de
     }
74b1de
 
74b1de
-    if (notify_handled && (ret != -1))
74b1de
+    if (notify_handled && (ret >= 0))
74b1de
         event_handled(ctx->event_pool, priv->sock, priv->idx, priv->gen);
74b1de
 
74b1de
     if (pollin) {
74b1de
@@ -2618,10 +2618,10 @@ socket_connect_finish(rpc_transport_t *this)
74b1de
 
74b1de
         ret = __socket_connect_finish(priv->sock);
74b1de
 
74b1de
-        if (ret == -1 && errno == EINPROGRESS)
74b1de
+        if ((ret < 0) && (errno == EINPROGRESS))
74b1de
             ret = 1;
74b1de
 
74b1de
-        if (ret == -1 && errno != EINPROGRESS) {
74b1de
+        if ((ret < 0) && (errno != EINPROGRESS)) {
74b1de
             if (!priv->connect_finish_log) {
74b1de
                 gf_log(this->name, GF_LOG_ERROR,
74b1de
                        "connection to %s failed (%s); "
74b1de
@@ -2640,7 +2640,7 @@ socket_connect_finish(rpc_transport_t *this)
74b1de
 
74b1de
             ret = getsockname(priv->sock, SA(&this->myinfo.sockaddr),
74b1de
                               &this->myinfo.sockaddr_len);
74b1de
-            if (ret == -1) {
74b1de
+            if (ret != 0) {
74b1de
                 gf_log(this->name, GF_LOG_WARNING,
74b1de
                        "getsockname on (%d) failed (%s) - "
74b1de
                        "disconnecting socket",
74b1de
@@ -2924,6 +2924,13 @@ socket_event_handler(int fd, int idx, int gen, void *data, int poll_in,
74b1de
         return;
74b1de
     }
74b1de
 
74b1de
+    /* At this point we are sure no other thread is using the transport because
74b1de
+     * we cannot receive more events until we call gf_event_handled(). However
74b1de
+     * this function may call gf_event_handled() in some cases. When this is
74b1de
+     * done, the transport may be destroyed at any moment if another thread
74b1de
+     * handled an error event. To prevent that we take a reference here. */
74b1de
+    rpc_transport_ref(this);
74b1de
+
74b1de
     GF_VALIDATE_OR_GOTO("socket", this, out);
74b1de
     GF_VALIDATE_OR_GOTO("socket", this->private, out);
74b1de
     GF_VALIDATE_OR_GOTO("socket", this->xl, out);
74b1de
@@ -2960,7 +2967,7 @@ socket_event_handler(int fd, int idx, int gen, void *data, int poll_in,
74b1de
             if (ret > 0) {
74b1de
                 gf_log(this->name, GF_LOG_TRACE,
74b1de
                        "(sock:%d) returning to wait on socket", priv->sock);
74b1de
-                return;
74b1de
+                goto out;
74b1de
             }
74b1de
         } else {
74b1de
             char *sock_type = (priv->is_server ? "Server" : "Client");
74b1de
@@ -3015,7 +3022,7 @@ socket_event_handler(int fd, int idx, int gen, void *data, int poll_in,
74b1de
     }
74b1de
 
74b1de
 out:
74b1de
-    return;
74b1de
+    rpc_transport_unref(this);
74b1de
 }
74b1de
 
74b1de
 static void
74b1de
@@ -3074,7 +3081,7 @@ socket_server_event_handler(int fd, int idx, int gen, void *data, int poll_in,
74b1de
 
74b1de
         event_handled(ctx->event_pool, fd, idx, gen);
74b1de
 
74b1de
-        if (new_sock == -1) {
74b1de
+        if (new_sock < 0) {
74b1de
             gf_log(this->name, GF_LOG_WARNING, "accept on %d failed (%s)",
74b1de
                    priv->sock, strerror(errno));
74b1de
             goto out;
74b1de
@@ -3082,7 +3089,7 @@ socket_server_event_handler(int fd, int idx, int gen, void *data, int poll_in,
74b1de
 
74b1de
         if (priv->nodelay && (new_sockaddr.ss_family != AF_UNIX)) {
74b1de
             ret = __socket_nodelay(new_sock);
74b1de
-            if (ret == -1) {
74b1de
+            if (ret != 0) {
74b1de
                 gf_log(this->name, GF_LOG_WARNING,
74b1de
                        "setsockopt() failed for "
74b1de
                        "NODELAY (%s)",
74b1de
@@ -3094,7 +3101,7 @@ socket_server_event_handler(int fd, int idx, int gen, void *data, int poll_in,
74b1de
             ret = __socket_keepalive(new_sock, new_sockaddr.ss_family,
74b1de
                                      priv->keepaliveintvl, priv->keepaliveidle,
74b1de
                                      priv->keepalivecnt, priv->timeout);
74b1de
-            if (ret == -1)
74b1de
+            if (ret != 0)
74b1de
                 gf_log(this->name, GF_LOG_WARNING,
74b1de
                        "Failed to set keep-alive: %s", strerror(errno));
74b1de
         }
74b1de
@@ -3110,7 +3117,7 @@ socket_server_event_handler(int fd, int idx, int gen, void *data, int poll_in,
74b1de
         }
74b1de
 
74b1de
         ret = pthread_mutex_init(&new_trans->lock, NULL);
74b1de
-        if (ret == -1) {
74b1de
+        if (ret != 0) {
74b1de
             gf_log(this->name, GF_LOG_WARNING,
74b1de
                    "pthread_mutex_init() failed: %s; closing newly accepted "
74b1de
                    "socket %d",
74b1de
@@ -3130,7 +3137,7 @@ socket_server_event_handler(int fd, int idx, int gen, void *data, int poll_in,
74b1de
 
74b1de
         ret = getsockname(new_sock, SA(&new_trans->myinfo.sockaddr),
74b1de
                           &new_trans->myinfo.sockaddr_len);
74b1de
-        if (ret == -1) {
74b1de
+        if (ret != 0) {
74b1de
             gf_log(this->name, GF_LOG_WARNING,
74b1de
                    "getsockname on socket %d "
74b1de
                    "failed (errno:%s); closing newly accepted socket",
74b1de
@@ -3237,7 +3244,7 @@ socket_server_event_handler(int fd, int idx, int gen, void *data, int poll_in,
74b1de
              */
74b1de
             ret = rpc_transport_notify(this, RPC_TRANSPORT_ACCEPT, new_trans);
74b1de
 
74b1de
-            if (ret != -1) {
74b1de
+            if (ret >= 0) {
74b1de
                 new_priv->idx = event_register(
74b1de
                     ctx->event_pool, new_sock, socket_event_handler, new_trans,
74b1de
                     1, 0, new_trans->notify_poller_death);
74b1de
@@ -3275,7 +3282,7 @@ socket_server_event_handler(int fd, int idx, int gen, void *data, int poll_in,
74b1de
             rpc_transport_unref(new_trans);
74b1de
         }
74b1de
 
74b1de
-        if (ret == -1) {
74b1de
+        if (ret < 0) {
74b1de
             gf_log(this->name, GF_LOG_WARNING, "closing newly accepted socket");
74b1de
             sys_close(new_sock);
74b1de
             /* this unref is to actually cause the destruction of
74b1de
@@ -3406,7 +3413,7 @@ socket_connect(rpc_transport_t *this, int port)
74b1de
 
74b1de
     pthread_mutex_lock(&priv->out_lock);
74b1de
     {
74b1de
-        if (priv->sock != -1) {
74b1de
+        if (priv->sock >= 0) {
74b1de
             gf_log_callingfn(this->name, GF_LOG_TRACE,
74b1de
                              "connect () called on transport "
74b1de
                              "already connected");
74b1de
@@ -3420,7 +3427,7 @@ socket_connect(rpc_transport_t *this, int port)
74b1de
 
74b1de
         ret = socket_client_get_remote_sockaddr(this, &sock_union.sa,
74b1de
                                                 &sockaddr_len, &sa_family);
74b1de
-        if (ret == -1) {
74b1de
+        if (ret < 0) {
74b1de
             /* logged inside client_get_remote_sockaddr */
74b1de
             goto unlock;
74b1de
         }
74b1de
@@ -3439,7 +3446,7 @@ socket_connect(rpc_transport_t *this, int port)
74b1de
         this->peerinfo.sockaddr_len = sockaddr_len;
74b1de
 
74b1de
         priv->sock = sys_socket(sa_family, SOCK_STREAM, 0);
74b1de
-        if (priv->sock == -1) {
74b1de
+        if (priv->sock < 0) {
74b1de
             gf_log(this->name, GF_LOG_ERROR, "socket creation failed (%s)",
74b1de
                    strerror(errno));
74b1de
             ret = -1;
74b1de
@@ -3451,7 +3458,7 @@ socket_connect(rpc_transport_t *this, int port)
74b1de
          */
74b1de
         if (priv->windowsize != 0) {
74b1de
             if (setsockopt(priv->sock, SOL_SOCKET, SO_RCVBUF, &priv->windowsize,
74b1de
-                           sizeof(priv->windowsize)) < 0) {
74b1de
+                           sizeof(priv->windowsize)) != 0) {
74b1de
                 gf_log(this->name, GF_LOG_ERROR,
74b1de
                        "setting receive window "
74b1de
                        "size failed: %d: %d: %s",
74b1de
@@ -3459,7 +3466,7 @@ socket_connect(rpc_transport_t *this, int port)
74b1de
             }
74b1de
 
74b1de
             if (setsockopt(priv->sock, SOL_SOCKET, SO_SNDBUF, &priv->windowsize,
74b1de
-                           sizeof(priv->windowsize)) < 0) {
74b1de
+                           sizeof(priv->windowsize)) != 0) {
74b1de
                 gf_log(this->name, GF_LOG_ERROR,
74b1de
                        "setting send window size "
74b1de
                        "failed: %d: %d: %s",
74b1de
@@ -3484,7 +3491,7 @@ socket_connect(rpc_transport_t *this, int port)
74b1de
         if (priv->nodelay && (sa_family != AF_UNIX)) {
74b1de
             ret = __socket_nodelay(priv->sock);
74b1de
 
74b1de
-            if (ret == -1) {
74b1de
+            if (ret != 0) {
74b1de
                 gf_log(this->name, GF_LOG_ERROR, "NODELAY on %d failed (%s)",
74b1de
                        priv->sock, strerror(errno));
74b1de
             }
74b1de
@@ -3494,7 +3501,7 @@ socket_connect(rpc_transport_t *this, int port)
74b1de
             ret = __socket_keepalive(priv->sock, sa_family,
74b1de
                                      priv->keepaliveintvl, priv->keepaliveidle,
74b1de
                                      priv->keepalivecnt, priv->timeout);
74b1de
-            if (ret == -1)
74b1de
+            if (ret != 0)
74b1de
                 gf_log(this->name, GF_LOG_ERROR, "Failed to set keep-alive: %s",
74b1de
                        strerror(errno));
74b1de
         }
74b1de
@@ -3516,7 +3523,7 @@ socket_connect(rpc_transport_t *this, int port)
74b1de
 
74b1de
         ret = client_bind(this, SA(&this->myinfo.sockaddr),
74b1de
                           &this->myinfo.sockaddr_len, priv->sock);
74b1de
-        if (ret == -1) {
74b1de
+        if (ret < 0) {
74b1de
             gf_log(this->name, GF_LOG_WARNING, "client bind failed: %s",
74b1de
                    strerror(errno));
74b1de
             goto handler;
74b1de
@@ -3525,7 +3532,7 @@ socket_connect(rpc_transport_t *this, int port)
74b1de
         /* make socket non-blocking for all types of sockets */
74b1de
         if (!priv->bio) {
74b1de
             ret = __socket_nonblock(priv->sock);
74b1de
-            if (ret == -1) {
74b1de
+            if (ret != 0) {
74b1de
                 gf_log(this->name, GF_LOG_ERROR, "NBIO on %d failed (%s)",
74b1de
                        priv->sock, strerror(errno));
74b1de
                 goto handler;
74b1de
@@ -3552,7 +3559,7 @@ socket_connect(rpc_transport_t *this, int port)
74b1de
 
74b1de
         connect_attempted = _gf_true;
74b1de
 
74b1de
-        if (ret == -1 && errno == ENOENT && ign_enoent) {
74b1de
+        if ((ret != 0) && (errno == ENOENT) && ign_enoent) {
74b1de
             gf_log(this->name, GF_LOG_WARNING,
74b1de
                    "Ignore failed connection attempt on %s, (%s) ",
74b1de
                    this->peerinfo.identifier, strerror(errno));
74b1de
@@ -3570,7 +3577,7 @@ socket_connect(rpc_transport_t *this, int port)
74b1de
             goto handler;
74b1de
         }
74b1de
 
74b1de
-        if (ret == -1 && ((errno != EINPROGRESS) && (errno != ENOENT))) {
74b1de
+        if ((ret != 0) && (errno != EINPROGRESS) && (errno != ENOENT)) {
74b1de
             /* For unix path based sockets, the socket path is
74b1de
              * cryptic (md5sum of path) and may not be useful for
74b1de
              * the user in debugging so log it in DEBUG
74b1de
@@ -3634,8 +3641,8 @@ socket_connect(rpc_transport_t *this, int port)
74b1de
     pthread_mutex_unlock(&priv->out_lock);
74b1de
 
74b1de
 err:
74b1de
-    /* if sock != -1, then cleanup is done from the event handler */
74b1de
-    if (ret == -1 && sock == -1) {
74b1de
+    /* if sock >= 0, then cleanup is done from the event handler */
74b1de
+    if ((ret < 0) && (sock < 0)) {
74b1de
         /* Cleaup requires to send notification to upper layer which
74b1de
            intern holds the big_lock. There can be dead-lock situation
74b1de
            if big_lock is already held by the current thread.
74b1de
@@ -3689,20 +3696,20 @@ socket_listen(rpc_transport_t *this)
74b1de
     }
74b1de
     pthread_mutex_unlock(&priv->out_lock);
74b1de
 
74b1de
-    if (sock != -1) {
74b1de
+    if (sock >= 0) {
74b1de
         gf_log_callingfn(this->name, GF_LOG_DEBUG, "already listening");
74b1de
         return ret;
74b1de
     }
74b1de
 
74b1de
     ret = socket_server_get_local_sockaddr(this, SA(&sockaddr), &sockaddr_len,
74b1de
                                            &sa_family);
74b1de
-    if (ret == -1) {
74b1de
+    if (ret < 0) {
74b1de
         return ret;
74b1de
     }
74b1de
 
74b1de
     pthread_mutex_lock(&priv->out_lock);
74b1de
     {
74b1de
-        if (priv->sock != -1) {
74b1de
+        if (priv->sock >= 0) {
74b1de
             gf_log(this->name, GF_LOG_DEBUG, "already listening");
74b1de
             goto unlock;
74b1de
         }
74b1de
@@ -3712,7 +3719,7 @@ socket_listen(rpc_transport_t *this)
74b1de
 
74b1de
         priv->sock = sys_socket(sa_family, SOCK_STREAM, 0);
74b1de
 
74b1de
-        if (priv->sock == -1) {
74b1de
+        if (priv->sock < 0) {
74b1de
             gf_log(this->name, GF_LOG_ERROR, "socket creation failed (%s)",
74b1de
                    strerror(errno));
74b1de
             goto unlock;
74b1de
@@ -3723,7 +3730,7 @@ socket_listen(rpc_transport_t *this)
74b1de
          */
74b1de
         if (priv->windowsize != 0) {
74b1de
             if (setsockopt(priv->sock, SOL_SOCKET, SO_RCVBUF, &priv->windowsize,
74b1de
-                           sizeof(priv->windowsize)) < 0) {
74b1de
+                           sizeof(priv->windowsize)) != 0) {
74b1de
                 gf_log(this->name, GF_LOG_ERROR,
74b1de
                        "setting receive window size "
74b1de
                        "failed: %d: %d: %s",
74b1de
@@ -3731,7 +3738,7 @@ socket_listen(rpc_transport_t *this)
74b1de
             }
74b1de
 
74b1de
             if (setsockopt(priv->sock, SOL_SOCKET, SO_SNDBUF, &priv->windowsize,
74b1de
-                           sizeof(priv->windowsize)) < 0) {
74b1de
+                           sizeof(priv->windowsize)) != 0) {
74b1de
                 gf_log(this->name, GF_LOG_ERROR,
74b1de
                        "setting send window size failed:"
74b1de
                        " %d: %d: %s",
74b1de
@@ -3741,7 +3748,7 @@ socket_listen(rpc_transport_t *this)
74b1de
 
74b1de
         if (priv->nodelay && (sa_family != AF_UNIX)) {
74b1de
             ret = __socket_nodelay(priv->sock);
74b1de
-            if (ret == -1) {
74b1de
+            if (ret != 0) {
74b1de
                 gf_log(this->name, GF_LOG_ERROR,
74b1de
                        "setsockopt() failed for NODELAY (%s)", strerror(errno));
74b1de
             }
74b1de
@@ -3750,7 +3757,7 @@ socket_listen(rpc_transport_t *this)
74b1de
         if (!priv->bio) {
74b1de
             ret = __socket_nonblock(priv->sock);
74b1de
 
74b1de
-            if (ret == -1) {
74b1de
+            if (ret != 0) {
74b1de
                 gf_log(this->name, GF_LOG_ERROR,
74b1de
                        "NBIO on socket %d failed "
74b1de
                        "(errno:%s); closing socket",
74b1de
@@ -3763,7 +3770,7 @@ socket_listen(rpc_transport_t *this)
74b1de
 
74b1de
         ret = __socket_server_bind(this);
74b1de
 
74b1de
-        if ((ret == -EADDRINUSE) || (ret == -1)) {
74b1de
+        if (ret < 0) {
74b1de
             /* logged inside __socket_server_bind() */
74b1de
             gf_log(this->name, GF_LOG_ERROR,
74b1de
                    "__socket_server_bind failed;"
74b1de
@@ -3779,7 +3786,7 @@ socket_listen(rpc_transport_t *this)
74b1de
 
74b1de
         ret = listen(priv->sock, priv->backlog);
74b1de
 
74b1de
-        if (ret == -1) {
74b1de
+        if (ret != 0) {
74b1de
             gf_log(this->name, GF_LOG_ERROR,
74b1de
                    "could not set socket %d to listen mode (errno:%s); "
74b1de
                    "closing socket",
74b1de
@@ -4025,7 +4032,7 @@ reconfigure(rpc_transport_t *this, dict_t *options)
74b1de
     priv = this->private;
74b1de
 
74b1de
     if (dict_get_str(options, "transport.socket.keepalive", &optstr) == 0) {
74b1de
-        if (gf_string2boolean(optstr, &tmp_bool) == -1) {
74b1de
+        if (gf_string2boolean(optstr, &tmp_bool) != 0) {
74b1de
             gf_log(this->name, GF_LOG_ERROR,
74b1de
                    "'transport.socket.keepalive' takes only "
74b1de
                    "boolean options, not taking any action");
74b1de
@@ -4094,7 +4101,7 @@ reconfigure(rpc_transport_t *this, dict_t *options)
74b1de
     if (dict_get(options, "non-blocking-io")) {
74b1de
         optstr = data_to_str(dict_get(options, "non-blocking-io"));
74b1de
 
74b1de
-        if (gf_string2boolean(optstr, &tmp_bool) == -1) {
74b1de
+        if (gf_string2boolean(optstr, &tmp_bool) != 0) {
74b1de
             gf_log(this->name, GF_LOG_ERROR,
74b1de
                    "'non-blocking-io' takes only boolean options,"
74b1de
                    " not taking any action");
74b1de
@@ -4109,7 +4116,7 @@ reconfigure(rpc_transport_t *this, dict_t *options)
74b1de
 
74b1de
     if (!priv->bio) {
74b1de
         ret = __socket_nonblock(priv->sock);
74b1de
-        if (ret == -1) {
74b1de
+        if (ret != 0) {
74b1de
             gf_log(this->name, GF_LOG_WARNING, "NBIO on %d failed (%s)",
74b1de
                    priv->sock, strerror(errno));
74b1de
             goto out;
74b1de
@@ -4508,7 +4515,7 @@ socket_init(rpc_transport_t *this)
74b1de
     if (dict_get(this->options, "non-blocking-io")) {
74b1de
         optstr = data_to_str(dict_get(this->options, "non-blocking-io"));
74b1de
 
74b1de
-        if (gf_string2boolean(optstr, &tmp_bool) == -1) {
74b1de
+        if (gf_string2boolean(optstr, &tmp_bool) != 0) {
74b1de
             gf_log(this->name, GF_LOG_ERROR,
74b1de
                    "'non-blocking-io' takes only boolean options,"
74b1de
                    " not taking any action");
74b1de
@@ -4528,7 +4535,7 @@ socket_init(rpc_transport_t *this)
74b1de
         optstr = data_to_str(
74b1de
             dict_get(this->options, "transport.socket.nodelay"));
74b1de
 
74b1de
-        if (gf_string2boolean(optstr, &tmp_bool) == -1) {
74b1de
+        if (gf_string2boolean(optstr, &tmp_bool) != 0) {
74b1de
             gf_log(this->name, GF_LOG_ERROR,
74b1de
                    "'transport.socket.nodelay' takes only "
74b1de
                    "boolean options, not taking any action");
74b1de
@@ -4559,7 +4566,7 @@ socket_init(rpc_transport_t *this)
74b1de
     priv->keepalivecnt = GF_KEEPALIVE_COUNT;
74b1de
     if (dict_get_str(this->options, "transport.socket.keepalive", &optstr) ==
74b1de
         0) {
74b1de
-        if (gf_string2boolean(optstr, &tmp_bool) == -1) {
74b1de
+        if (gf_string2boolean(optstr, &tmp_bool) != 0) {
74b1de
             gf_log(this->name, GF_LOG_ERROR,
74b1de
                    "'transport.socket.keepalive' takes only "
74b1de
                    "boolean options, not taking any action");
74b1de
@@ -4609,7 +4616,7 @@ socket_init(rpc_transport_t *this)
74b1de
     if (dict_get(this->options, "transport.socket.read-fail-log")) {
74b1de
         optstr = data_to_str(
74b1de
             dict_get(this->options, "transport.socket.read-fail-log"));
74b1de
-        if (gf_string2boolean(optstr, &tmp_bool) == -1) {
74b1de
+        if (gf_string2boolean(optstr, &tmp_bool) != 0) {
74b1de
             gf_log(this->name, GF_LOG_WARNING,
74b1de
                    "'transport.socket.read-fail-log' takes only "
74b1de
                    "boolean options; logging socket read fails");
74b1de
@@ -4646,7 +4653,7 @@ fini(rpc_transport_t *this)
74b1de
 
74b1de
     priv = this->private;
74b1de
     if (priv) {
74b1de
-        if (priv->sock != -1) {
74b1de
+        if (priv->sock >= 0) {
74b1de
             pthread_mutex_lock(&priv->out_lock);
74b1de
             {
74b1de
                 __socket_ioq_flush(this);
74b1de
@@ -4683,7 +4690,7 @@ init(rpc_transport_t *this)
74b1de
 
74b1de
     ret = socket_init(this);
74b1de
 
74b1de
-    if (ret == -1) {
74b1de
+    if (ret < 0) {
74b1de
         gf_log(this->name, GF_LOG_DEBUG, "socket_init() failed");
74b1de
     }
74b1de
 
74b1de
-- 
74b1de
1.8.3.1
74b1de