summaryrefslogtreecommitdiffstats
path: root/xlators/protocol
diff options
context:
space:
mode:
authorKotresh HR <khiremat@redhat.com>2015-04-24 17:31:03 +0530
committerRaghavendra G <rgowdapp@redhat.com>2015-05-04 04:08:26 -0700
commitdc0020c72d5c2d20328b89224b149ebb87002277 (patch)
tree2eea570ce0e71620710e6217081114a495eefcb3 /xlators/protocol
parent9e6b521cc98b3ba099c1713639be9180be5b031f (diff)
rpc: Maintain separate xlator pointer in 'rpcsvc_state'
The structure 'rpcsvc_state', which maintains rpc server state had no separate pointer to track the translator. It was using the mydata pointer itself. So callers were forced to send xlator pointer as mydata which is opaque (void pointer) by function prototype. 'rpcsvc_register_init' is setting svc->mydata with xlator pointer. 'rpcsvc_register_notify' is overwriting svc->mydata with mydata pointer. And rpc interprets svc->mydata as xlator pointer internally. If someone passes non xlator structure pointer to rpcsvc_register_notify as libgfchangelog currently does, it might corrupt mydata. So interpreting opaque mydata as xlator pointer is incorrect as it is caller's choice to send mydata as any type of data to 'rpcsvc_register_notify'. Maintaining two different pointers in 'rpcsvc_state' for xlator and mydata solves the issue. Change-Id: I7874933fefc68f3fe01d44f92016a8e4e9768378 BUG: 1215161 Signed-off-by: Kotresh HR <khiremat@redhat.com> Reviewed-on: http://review.gluster.org/10366 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Raghavendra G <rgowdapp@redhat.com> Tested-by: Raghavendra G <rgowdapp@redhat.com>
Diffstat (limited to 'xlators/protocol')
-rw-r--r--xlators/protocol/server/src/server-handshake.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/xlators/protocol/server/src/server-handshake.c b/xlators/protocol/server/src/server-handshake.c
index ecb80b9aece..556b0e21e7f 100644
--- a/xlators/protocol/server/src/server-handshake.c
+++ b/xlators/protocol/server/src/server-handshake.c
@@ -257,7 +257,7 @@ server_getspec (rpcsvc_request_t *req)
gf_getspec_req args = {0,};
gf_getspec_rsp rsp = {0,};
- this = req->svc->mydata;
+ this = req->svc->xl;
conf = this->private;
ret = xdr_to_generic (req->msg[0], &args,
(xdrproc_t)xdr_gf_getspec_req);
@@ -367,7 +367,7 @@ server_setvolume (rpcsvc_request_t *req)
goto fail;
}
- this = req->svc->mydata;
+ this = req->svc->xl;
config_params = dict_copy_with_ref (this->options, NULL);
conf = this->private;
@@ -741,7 +741,7 @@ server_set_lk_version (rpcsvc_request_t *req)
server_ctx_t *serv_ctx = NULL;
xlator_t *this = NULL;
- this = req->svc->mydata;
+ this = req->svc->xl;
//TODO: Decide on an appropriate errno for the error-path
//below
if (!this)