Patchwork [BUG:1558] rpc-transport/rdma: fix memory corruptions caused by rdma.

login
register
Submitter Raghavendra G
Date 2010-09-07 18:32:27
Message ID <20100907183227.GA7304@dev.gluster.com>
Download mbox | patch
Permalink /patch/4642/
State Accepted
Delegated to: Vijay Bellur
Headers show

Comments

Raghavendra G - 2010-09-07 18:32:27
- disconnect notification should be sent before unrefing transport,
    since transport might be freed when unrefed.
  - set trans->listener. This member is used by rpcsvc to decide whether
    a listener or a new connection is dead.

Signed-off-by: Raghavendra G <raghavendra@gluster.com>
---
 rpc/rpc-transport/rdma/src/rdma.c |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)

Patch

diff --git a/rpc/rpc-transport/rdma/src/rdma.c b/rpc/rpc-transport/rdma/src/rdma.c
index 2ea787c..ccc759e 100644
--- a/rpc/rpc-transport/rdma/src/rdma.c
+++ b/rpc/rpc-transport/rdma/src/rdma.c
@@ -4253,11 +4253,11 @@  rdma_handshake_pollerr (rpc_transport_t *this)
         }
         pthread_mutex_unlock (&priv->write_mutex);
 
+        rpc_transport_notify (this, RPC_TRANSPORT_DISCONNECT, this);
+
         if (need_unref)
                 rpc_transport_unref (this);
 
-        rpc_transport_notify (this, RPC_TRANSPORT_DISCONNECT, this);
-
         return 0;
 }
 
@@ -4521,6 +4521,8 @@  rdma_server_event_handler (int fd, int idx, void *data,
                 return -1;
         }
 
+        this->listener = trans;
+
         priv = GF_CALLOC (1, sizeof (rdma_private_t),
                           gf_common_mt_rdma_private_t);
         if (priv == NULL) {