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