diff options
author | Amar Tumballi <amar@gluster.com> | 2010-09-28 11:01:10 +0000 |
---|---|---|
committer | Vijay Bellur <vijay@dev.gluster.com> | 2010-09-28 21:54:13 -0700 |
commit | 2e8f8e85e9f5ccbefe834498d4cf665728c70303 (patch) | |
tree | 79d5d690b8303d68300acd116bcf16c2086e0a06 | |
parent | 7fa2a88a28578dce36d88436776c05aee65165fd (diff) |
client-handshake: prevent NULL dereference
Signed-off-by: Amar Tumballi <amar@gluster.com>
Signed-off-by: Vijay Bellur <vijay@dev.gluster.com>
BUG: 1720 ()
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1720
-rw-r--r-- | xlators/protocol/client/src/client-handshake.c | 44 |
1 files changed, 33 insertions, 11 deletions
diff --git a/xlators/protocol/client/src/client-handshake.c b/xlators/protocol/client/src/client-handshake.c index 48f19861b0e..7511813d3cb 100644 --- a/xlators/protocol/client/src/client-handshake.c +++ b/xlators/protocol/client/src/client-handshake.c @@ -53,19 +53,23 @@ rpc_client_ping_timer_expired (void *data) xlator_t *this = NULL; clnt_conf_t *conf = NULL; - if (!data) { + this = data; + + if (!this || !this->private) { goto out; } - this = data; conf = this->private; - conn = &conf->rpc->conn; + clnt = conf->rpc; + if (!clnt) + goto out; + + conn = &clnt->conn; trans = conn->trans; - if (!clnt || !trans) { + if (!trans) goto out; - } pthread_mutex_lock (&conn->lock); { @@ -130,7 +134,12 @@ client_start_ping (void *data) int frame_count = 0; this = data; + if (!this || !this->private) + goto fail; + conf = this->private; + if (!conf->rpc) + goto fail; conn = &conf->rpc->conn; @@ -213,9 +222,14 @@ client_ping_cbk (struct rpc_req *req, struct iovec *iov, int count, call_frame_t *frame = NULL; clnt_conf_t *conf = NULL; - frame = myframe; + if (!myframe) + goto out; + frame = myframe; this = frame->this; + if (!this || !this->private) + goto out; + conf = this->private; conn = &conf->rpc->conn; @@ -251,7 +265,8 @@ client_ping_cbk (struct rpc_req *req, struct iovec *iov, int count, } pthread_mutex_unlock (&conn->lock); out: - STACK_DESTROY (frame->root); + if (frame) + STACK_DESTROY (frame->root); return 0; } @@ -708,9 +723,13 @@ client_query_portmap_cbk (struct rpc_req *req, struct iovec *iov, int count, voi clnt_conf_t *conf = NULL; int ret = -1; struct rpc_clnt_config config = {0, }; - + xlator_t *this = NULL; frame = myframe; + if (!frame || !frame->this || !frame->this->private) + goto out; + + this = frame->this; conf = frame->this->private; if (-1 == req->rpc_status) { @@ -735,11 +754,14 @@ client_query_portmap_cbk (struct rpc_req *req, struct iovec *iov, int count, voi rpc_clnt_reconfig (conf->rpc, &config); out: - STACK_DESTROY (frame->root); + if (frame) + STACK_DESTROY (frame->root); - rpc_transport_disconnect (conf->rpc->conn.trans); + if (conf) { + rpc_transport_disconnect (conf->rpc->conn.trans); - rpc_clnt_reconnect (conf->rpc->conn.trans); + rpc_clnt_reconnect (conf->rpc->conn.trans); + } return ret; } |