diff options
Diffstat (limited to '0102-rpc-transport-Missing-a-ref-on-dict-while-creating-t.patch')
-rw-r--r-- | 0102-rpc-transport-Missing-a-ref-on-dict-while-creating-t.patch | 737 |
1 files changed, 737 insertions, 0 deletions
diff --git a/0102-rpc-transport-Missing-a-ref-on-dict-while-creating-t.patch b/0102-rpc-transport-Missing-a-ref-on-dict-while-creating-t.patch new file mode 100644 index 0000000..39fe021 --- /dev/null +++ b/0102-rpc-transport-Missing-a-ref-on-dict-while-creating-t.patch @@ -0,0 +1,737 @@ +From df6523ed3c5267624197b52edcb553fc2d8a08f2 Mon Sep 17 00:00:00 2001 +From: Mohammed Rafi KC <rkavunga@redhat.com> +Date: Tue, 26 Feb 2019 18:04:18 +0530 +Subject: [PATCH 102/124] rpc/transport: Missing a ref on dict while creating + transport object + +while creating rpc_tranpsort object, we store a dictionary without +taking a ref on dict but it does an unref during the cleaning of the +transport object. + +So the rpc layer expect the caller to take a ref on the dictionary +before passing dict to rpc layer. This leads to a lot of confusion +across the code base and leads to ref leaks. + +Semantically, this is not correct. It is the rpc layer responsibility +to take a ref when storing it, and free during the cleanup. + +I'm listing down the total issues or leaks across the code base because +of this confusion. These issues are currently present in the upstream +master. + +1) changelog_rpc_client_init + +2) quota_enforcer_init + +3) rpcsvc_create_listeners : when there are two transport, like tcp,rdma. + +4) quotad_aggregator_init + +5) glusterd: init + +6) nfs3_init_state + +7) server: init + +8) client:init + +This patch does the cleanup according to the semantics. + +Backport of : https://review.gluster.org/#/c/glusterfs/+/22266/ + +>Change-Id: I46373af9630373eb375ee6de0e6f2bbe2a677425 +>updates: bz#1659708 +>Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com> + +Change-Id: Iff978497e11592fbebfa4b683fdc56698b782859 +BUG: 1471742 +Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com> +Reviewed-on: https://code.engineering.redhat.com/gerrit/167847 +Tested-by: RHGS Build Bot <nigelb@redhat.com> +Reviewed-by: Atin Mukherjee <amukherj@redhat.com> +--- + api/src/glfs-mgmt.c | 10 ++++-- + cli/src/cli.c | 20 +++++++----- + glusterfsd/src/glusterfsd-mgmt.c | 18 ++++++++-- + rpc/rpc-lib/src/rpc-clnt.c | 2 -- + rpc/rpc-lib/src/rpc-transport.c | 38 +++++++--------------- + rpc/rpc-lib/src/rpc-transport.h | 4 +-- + rpc/rpc-lib/src/rpcsvc.c | 13 ++------ + rpc/rpc-lib/src/rpcsvc.h | 2 +- + .../features/changelog/src/changelog-rpc-common.c | 9 +++-- + .../snapview-server/src/snapview-server-mgmt.c | 8 ++++- + xlators/mgmt/glusterd/src/glusterd-conn-mgmt.c | 8 ++++- + xlators/mgmt/glusterd/src/glusterd-handler.c | 18 ++++++---- + xlators/mgmt/glusterd/src/glusterd-rebalance.c | 8 ++++- + xlators/mgmt/glusterd/src/glusterd-utils.c | 9 +++-- + xlators/mgmt/glusterd/src/glusterd.c | 6 +++- + xlators/nfs/server/src/acl3.c | 5 +++ + xlators/nfs/server/src/mount3.c | 5 +++ + xlators/nfs/server/src/nlm4.c | 7 ++++ + 18 files changed, 119 insertions(+), 71 deletions(-) + +diff --git a/api/src/glfs-mgmt.c b/api/src/glfs-mgmt.c +index d502b4f..7476d5b 100644 +--- a/api/src/glfs-mgmt.c ++++ b/api/src/glfs-mgmt.c +@@ -1015,6 +1015,10 @@ glfs_mgmt_init(struct glfs *fs) + if (ctx->mgmt) + return 0; + ++ options = dict_new(); ++ if (!options) ++ goto out; ++ + if (cmd_args->volfile_server_port) + port = cmd_args->volfile_server_port; + +@@ -1029,11 +1033,11 @@ glfs_mgmt_init(struct glfs *fs) + + if (cmd_args->volfile_server_transport && + !strcmp(cmd_args->volfile_server_transport, "unix")) { +- ret = rpc_transport_unix_options_build(&options, host, 0); ++ ret = rpc_transport_unix_options_build(options, host, 0); + } else { + xlator_cmdline_option_t *opt = find_xlator_option_in_cmd_args_t( + "address-family", cmd_args); +- ret = rpc_transport_inet_options_build(&options, host, port, ++ ret = rpc_transport_inet_options_build(options, host, port, + (opt ? opt->value : NULL)); + } + +@@ -1075,5 +1079,7 @@ glfs_mgmt_init(struct glfs *fs) + + ret = rpc_clnt_start(rpc); + out: ++ if (options) ++ dict_unref(options); + return ret; + } +diff --git a/cli/src/cli.c b/cli/src/cli.c +index c33d152..ff39a98 100644 +--- a/cli/src/cli.c ++++ b/cli/src/cli.c +@@ -661,9 +661,8 @@ cli_quotad_clnt_rpc_init(void) + + global_quotad_rpc = rpc; + out: +- if (ret) { +- if (rpc_opts) +- dict_unref(rpc_opts); ++ if (rpc_opts) { ++ dict_unref(rpc_opts); + } + return rpc; + } +@@ -685,6 +684,10 @@ cli_rpc_init(struct cli_state *state) + this = THIS; + cli_rpc_prog = &cli_prog; + ++ options = dict_new(); ++ if (!options) ++ goto out; ++ + /* If address family specified in CLI */ + if (state->address_family) { + addr_family = state->address_family; +@@ -699,7 +702,7 @@ cli_rpc_init(struct cli_state *state) + "Connecting to glusterd using " + "sockfile %s", + state->glusterd_sock); +- ret = rpc_transport_unix_options_build(&options, state->glusterd_sock, ++ ret = rpc_transport_unix_options_build(options, state->glusterd_sock, + 0); + if (ret) + goto out; +@@ -709,10 +712,6 @@ cli_rpc_init(struct cli_state *state) + "%s", + state->remote_host); + +- options = dict_new(); +- if (!options) +- goto out; +- + ret = dict_set_str(options, "remote-host", state->remote_host); + if (ret) + goto out; +@@ -731,7 +730,7 @@ cli_rpc_init(struct cli_state *state) + gf_log("cli", GF_LOG_DEBUG, + "Connecting to glusterd using " + "default socket"); +- ret = rpc_transport_unix_options_build(&options, ++ ret = rpc_transport_unix_options_build(options, + DEFAULT_GLUSTERD_SOCKFILE, 0); + if (ret) + goto out; +@@ -749,6 +748,9 @@ cli_rpc_init(struct cli_state *state) + + ret = rpc_clnt_start(rpc); + out: ++ if (options) ++ dict_unref(options); ++ + if (ret) { + if (rpc) + rpc_clnt_unref(rpc); +diff --git a/glusterfsd/src/glusterfsd-mgmt.c b/glusterfsd/src/glusterfsd-mgmt.c +index a89c980..1d2cd1a 100644 +--- a/glusterfsd/src/glusterfsd-mgmt.c ++++ b/glusterfsd/src/glusterfsd-mgmt.c +@@ -2781,7 +2781,11 @@ glusterfs_listener_init(glusterfs_ctx_t *ctx) + if (!cmd_args->sock_file) + return 0; + +- ret = rpcsvc_transport_unix_options_build(&options, cmd_args->sock_file); ++ options = dict_new(); ++ if (!options) ++ goto out; ++ ++ ret = rpcsvc_transport_unix_options_build(options, cmd_args->sock_file); + if (ret) + goto out; + +@@ -2808,6 +2812,8 @@ glusterfs_listener_init(glusterfs_ctx_t *ctx) + ctx->listener = rpc; + + out: ++ if (options) ++ dict_unref(options); + return ret; + } + +@@ -2889,6 +2895,10 @@ glusterfs_mgmt_init(glusterfs_ctx_t *ctx) + if (ctx->mgmt) + return 0; + ++ options = dict_new(); ++ if (!options) ++ goto out; ++ + LOCK_INIT(&ctx->volfile_lock); + + if (cmd_args->volfile_server_port) +@@ -2898,10 +2908,10 @@ glusterfs_mgmt_init(glusterfs_ctx_t *ctx) + + if (cmd_args->volfile_server_transport && + !strcmp(cmd_args->volfile_server_transport, "unix")) { +- ret = rpc_transport_unix_options_build(&options, host, 0); ++ ret = rpc_transport_unix_options_build(options, host, 0); + } else { + opt = find_xlator_option_in_cmd_args_t("address-family", cmd_args); +- ret = rpc_transport_inet_options_build(&options, host, port, ++ ret = rpc_transport_inet_options_build(options, host, port, + (opt ? opt->value : NULL)); + } + if (ret) +@@ -2950,6 +2960,8 @@ glusterfs_mgmt_init(glusterfs_ctx_t *ctx) + + ret = rpc_clnt_start(rpc); + out: ++ if (options) ++ dict_unref(options); + return ret; + } + +diff --git a/rpc/rpc-lib/src/rpc-clnt.c b/rpc/rpc-lib/src/rpc-clnt.c +index 6f47515..b04eaed 100644 +--- a/rpc/rpc-lib/src/rpc-clnt.c ++++ b/rpc/rpc-lib/src/rpc-clnt.c +@@ -1125,8 +1125,6 @@ rpc_clnt_new(dict_t *options, xlator_t *owner, char *name, + mem_pool_destroy(rpc->saved_frames_pool); + GF_FREE(rpc); + rpc = NULL; +- if (options) +- dict_unref(options); + goto out; + } + +diff --git a/rpc/rpc-lib/src/rpc-transport.c b/rpc/rpc-lib/src/rpc-transport.c +index 4beaaf9..bed1f8c 100644 +--- a/rpc/rpc-lib/src/rpc-transport.c ++++ b/rpc/rpc-lib/src/rpc-transport.c +@@ -168,6 +168,11 @@ rpc_transport_cleanup(rpc_transport_t *trans) + if (trans->fini) + trans->fini(trans); + ++ if (trans->options) { ++ dict_unref(trans->options); ++ trans->options = NULL; ++ } ++ + GF_FREE(trans->name); + + if (trans->xl) +@@ -352,7 +357,7 @@ rpc_transport_load(glusterfs_ctx_t *ctx, dict_t *options, char *trans_name) + } + } + +- trans->options = options; ++ trans->options = dict_ref(options); + + pthread_mutex_init(&trans->lock, NULL); + trans->xl = this; +@@ -591,19 +596,14 @@ out: + } + + int +-rpc_transport_unix_options_build(dict_t **options, char *filepath, ++rpc_transport_unix_options_build(dict_t *dict, char *filepath, + int frame_timeout) + { +- dict_t *dict = NULL; + char *fpath = NULL; + int ret = -1; + + GF_ASSERT(filepath); +- GF_ASSERT(options); +- +- dict = dict_new(); +- if (!dict) +- goto out; ++ GF_VALIDATE_OR_GOTO("rpc-transport", dict, out); + + fpath = gf_strdup(filepath); + if (!fpath) { +@@ -638,20 +638,14 @@ rpc_transport_unix_options_build(dict_t **options, char *filepath, + if (ret) + goto out; + } +- +- *options = dict; + out: +- if (ret && dict) { +- dict_unref(dict); +- } + return ret; + } + + int +-rpc_transport_inet_options_build(dict_t **options, const char *hostname, +- int port, char *af) ++rpc_transport_inet_options_build(dict_t *dict, const char *hostname, int port, ++ char *af) + { +- dict_t *dict = NULL; + char *host = NULL; + int ret = -1; + #ifdef IPV6_DEFAULT +@@ -660,13 +654,9 @@ rpc_transport_inet_options_build(dict_t **options, const char *hostname, + char *addr_family = "inet"; + #endif + +- GF_ASSERT(options); + GF_ASSERT(hostname); + GF_ASSERT(port >= 1024); +- +- dict = dict_new(); +- if (!dict) +- goto out; ++ GF_VALIDATE_OR_GOTO("rpc-transport", dict, out); + + host = gf_strdup((char *)hostname); + if (!host) { +@@ -702,12 +692,6 @@ rpc_transport_inet_options_build(dict_t **options, const char *hostname, + "failed to set trans-type with socket"); + goto out; + } +- +- *options = dict; + out: +- if (ret && dict) { +- dict_unref(dict); +- } +- + return ret; + } +diff --git a/rpc/rpc-lib/src/rpc-transport.h b/rpc/rpc-lib/src/rpc-transport.h +index 9e75d1a..64b7e9b 100644 +--- a/rpc/rpc-lib/src/rpc-transport.h ++++ b/rpc/rpc-lib/src/rpc-transport.h +@@ -303,11 +303,11 @@ rpc_transport_keepalive_options_set(dict_t *options, int32_t interval, + int32_t time, int32_t timeout); + + int +-rpc_transport_unix_options_build(dict_t **options, char *filepath, ++rpc_transport_unix_options_build(dict_t *options, char *filepath, + int frame_timeout); + + int +-rpc_transport_inet_options_build(dict_t **options, const char *hostname, ++rpc_transport_inet_options_build(dict_t *options, const char *hostname, + int port, char *af); + + void +diff --git a/rpc/rpc-lib/src/rpcsvc.c b/rpc/rpc-lib/src/rpcsvc.c +index 74373c4..5a35139 100644 +--- a/rpc/rpc-lib/src/rpcsvc.c ++++ b/rpc/rpc-lib/src/rpcsvc.c +@@ -2615,18 +2615,13 @@ rpcsvc_reconfigure_options(rpcsvc_t *svc, dict_t *options) + } + + int +-rpcsvc_transport_unix_options_build(dict_t **options, char *filepath) ++rpcsvc_transport_unix_options_build(dict_t *dict, char *filepath) + { +- dict_t *dict = NULL; + char *fpath = NULL; + int ret = -1; + + GF_ASSERT(filepath); +- GF_ASSERT(options); +- +- dict = dict_new(); +- if (!dict) +- goto out; ++ GF_VALIDATE_OR_GOTO("rpcsvc", dict, out); + + fpath = gf_strdup(filepath); + if (!fpath) { +@@ -2649,13 +2644,9 @@ rpcsvc_transport_unix_options_build(dict_t **options, char *filepath) + ret = dict_set_str(dict, "transport-type", "socket"); + if (ret) + goto out; +- +- *options = dict; + out: + if (ret) { + GF_FREE(fpath); +- if (dict) +- dict_unref(dict); + } + return ret; + } +diff --git a/rpc/rpc-lib/src/rpcsvc.h b/rpc/rpc-lib/src/rpcsvc.h +index 34045ce..a51edc7 100644 +--- a/rpc/rpc-lib/src/rpcsvc.h ++++ b/rpc/rpc-lib/src/rpcsvc.h +@@ -665,7 +665,7 @@ rpcsvc_actor_t * + rpcsvc_program_actor(rpcsvc_request_t *req); + + int +-rpcsvc_transport_unix_options_build(dict_t **options, char *filepath); ++rpcsvc_transport_unix_options_build(dict_t *options, char *filepath); + int + rpcsvc_set_allow_insecure(rpcsvc_t *svc, dict_t *options); + int +diff --git a/xlators/features/changelog/src/changelog-rpc-common.c b/xlators/features/changelog/src/changelog-rpc-common.c +index cf35175..dcdcfb1 100644 +--- a/xlators/features/changelog/src/changelog-rpc-common.c ++++ b/xlators/features/changelog/src/changelog-rpc-common.c +@@ -47,7 +47,7 @@ changelog_rpc_client_init(xlator_t *this, void *cbkdata, char *sockfile, + if (!options) + goto error_return; + +- ret = rpc_transport_unix_options_build(&options, sockfile, 0); ++ ret = rpc_transport_unix_options_build(options, sockfile, 0); + if (ret) { + gf_msg(this->name, GF_LOG_ERROR, 0, CHANGELOG_MSG_RPC_BUILD_ERROR, + "failed to build rpc options"); +@@ -73,6 +73,7 @@ changelog_rpc_client_init(xlator_t *this, void *cbkdata, char *sockfile, + goto dealloc_rpc_clnt; + } + ++ dict_unref(options); + return rpc; + + dealloc_rpc_clnt: +@@ -303,7 +304,11 @@ changelog_rpc_server_init(xlator_t *this, char *sockfile, void *cbkdata, + if (!cbkdata) + cbkdata = this; + +- ret = rpcsvc_transport_unix_options_build(&options, sockfile); ++ options = dict_new(); ++ if (!options) ++ return NULL; ++ ++ ret = rpcsvc_transport_unix_options_build(options, sockfile); + if (ret) + goto dealloc_dict; + +diff --git a/xlators/features/snapview-server/src/snapview-server-mgmt.c b/xlators/features/snapview-server/src/snapview-server-mgmt.c +index b608cdf..bc415ef 100644 +--- a/xlators/features/snapview-server/src/snapview-server-mgmt.c ++++ b/xlators/features/snapview-server/src/snapview-server-mgmt.c +@@ -101,8 +101,12 @@ svs_mgmt_init(xlator_t *this) + if (cmd_args->volfile_server) + host = cmd_args->volfile_server; + ++ options = dict_new(); ++ if (!options) ++ goto out; ++ + opt = find_xlator_option_in_cmd_args_t("address-family", cmd_args); +- ret = rpc_transport_inet_options_build(&options, host, port, ++ ret = rpc_transport_inet_options_build(options, host, port, + (opt != NULL ? opt->value : NULL)); + if (ret) { + gf_msg(this->name, GF_LOG_ERROR, 0, SVS_MSG_BUILD_TRNSPRT_OPT_FAILED, +@@ -145,6 +149,8 @@ svs_mgmt_init(xlator_t *this) + gf_msg_debug(this->name, 0, "svs mgmt init successful"); + + out: ++ if (options) ++ dict_unref(options); + if (ret) + if (priv) { + rpc_clnt_connection_cleanup(&priv->rpc->conn); +diff --git a/xlators/mgmt/glusterd/src/glusterd-conn-mgmt.c b/xlators/mgmt/glusterd/src/glusterd-conn-mgmt.c +index 052438c..16eefa1 100644 +--- a/xlators/mgmt/glusterd/src/glusterd-conn-mgmt.c ++++ b/xlators/mgmt/glusterd/src/glusterd-conn-mgmt.c +@@ -29,6 +29,10 @@ glusterd_conn_init(glusterd_conn_t *conn, char *sockpath, int frame_timeout, + if (!this) + goto out; + ++ options = dict_new(); ++ if (!options) ++ goto out; ++ + svc = glusterd_conn_get_svc_object(conn); + if (!svc) { + gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_SVC_GET_FAIL, +@@ -36,7 +40,7 @@ glusterd_conn_init(glusterd_conn_t *conn, char *sockpath, int frame_timeout, + goto out; + } + +- ret = rpc_transport_unix_options_build(&options, sockpath, frame_timeout); ++ ret = rpc_transport_unix_options_build(options, sockpath, frame_timeout); + if (ret) + goto out; + +@@ -66,6 +70,8 @@ glusterd_conn_init(glusterd_conn_t *conn, char *sockpath, int frame_timeout, + conn->rpc = rpc; + conn->notify = notify; + out: ++ if (options) ++ dict_unref(options); + if (ret) { + if (rpc) { + rpc_clnt_unref(rpc); +diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c +index 1cb9013..6147995 100644 +--- a/xlators/mgmt/glusterd/src/glusterd-handler.c ++++ b/xlators/mgmt/glusterd/src/glusterd-handler.c +@@ -3493,11 +3493,10 @@ out: + } + + int +-glusterd_transport_inet_options_build(dict_t **options, const char *hostname, ++glusterd_transport_inet_options_build(dict_t *dict, const char *hostname, + int port, char *af) + { + xlator_t *this = NULL; +- dict_t *dict = NULL; + int32_t interval = -1; + int32_t time = -1; + int32_t timeout = -1; +@@ -3505,14 +3504,14 @@ glusterd_transport_inet_options_build(dict_t **options, const char *hostname, + + this = THIS; + GF_ASSERT(this); +- GF_ASSERT(options); ++ GF_ASSERT(dict); + GF_ASSERT(hostname); + + if (!port) + port = GLUSTERD_DEFAULT_PORT; + + /* Build default transport options */ +- ret = rpc_transport_inet_options_build(&dict, hostname, port, af); ++ ret = rpc_transport_inet_options_build(dict, hostname, port, af); + if (ret) + goto out; + +@@ -3552,7 +3551,6 @@ glusterd_transport_inet_options_build(dict_t **options, const char *hostname, + if ((interval > 0) || (time > 0)) + ret = rpc_transport_keepalive_options_set(dict, interval, time, + timeout); +- *options = dict; + out: + gf_msg_debug("glusterd", 0, "Returning %d", ret); + return ret; +@@ -3572,6 +3570,10 @@ glusterd_friend_rpc_create(xlator_t *this, glusterd_peerinfo_t *peerinfo, + if (!peerctx) + goto out; + ++ options = dict_new(); ++ if (!options) ++ goto out; ++ + if (args) + peerctx->args = *args; + +@@ -3586,7 +3588,7 @@ glusterd_friend_rpc_create(xlator_t *this, glusterd_peerinfo_t *peerinfo, + if (ret) + gf_log(this->name, GF_LOG_TRACE, + "option transport.address-family is not set in xlator options"); +- ret = glusterd_transport_inet_options_build(&options, peerinfo->hostname, ++ ret = glusterd_transport_inet_options_build(options, peerinfo->hostname, + peerinfo->port, af); + if (ret) + goto out; +@@ -3596,6 +3598,7 @@ glusterd_friend_rpc_create(xlator_t *this, glusterd_peerinfo_t *peerinfo, + * create our RPC endpoint with the same address that the peer would + * use to reach us. + */ ++ + if (this->options) { + data = dict_getn(this->options, "transport.socket.bind-address", + SLEN("transport.socket.bind-address")); +@@ -3637,6 +3640,9 @@ glusterd_friend_rpc_create(xlator_t *this, glusterd_peerinfo_t *peerinfo, + peerctx = NULL; + ret = 0; + out: ++ if (options) ++ dict_unref(options); ++ + GF_FREE(peerctx); + return ret; + } +diff --git a/xlators/mgmt/glusterd/src/glusterd-rebalance.c b/xlators/mgmt/glusterd/src/glusterd-rebalance.c +index ed5ded5..cbed9a9 100644 +--- a/xlators/mgmt/glusterd/src/glusterd-rebalance.c ++++ b/xlators/mgmt/glusterd/src/glusterd-rebalance.c +@@ -391,6 +391,10 @@ glusterd_rebalance_rpc_create(glusterd_volinfo_t *volinfo) + if (!defrag) + goto out; + ++ options = dict_new(); ++ if (!options) ++ goto out; ++ + GLUSTERD_GET_DEFRAG_SOCK_FILE(sockfile, volinfo); + /* Check if defrag sockfile exists in the new location + * in /var/run/ , if it does not try the old location +@@ -420,7 +424,7 @@ glusterd_rebalance_rpc_create(glusterd_volinfo_t *volinfo) + * default timeout of 30mins used for unreliable network connections is + * too long for unix domain socket connections. + */ +- ret = rpc_transport_unix_options_build(&options, sockfile, 600); ++ ret = rpc_transport_unix_options_build(options, sockfile, 600); + if (ret) { + gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_UNIX_OP_BUILD_FAIL, + "Unix options build failed"); +@@ -437,6 +441,8 @@ glusterd_rebalance_rpc_create(glusterd_volinfo_t *volinfo) + } + ret = 0; + out: ++ if (options) ++ dict_unref(options); + return ret; + } + +diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c +index ef664c2..2dd5f91 100644 +--- a/xlators/mgmt/glusterd/src/glusterd-utils.c ++++ b/xlators/mgmt/glusterd/src/glusterd-utils.c +@@ -1980,7 +1980,11 @@ glusterd_brick_connect(glusterd_volinfo_t *volinfo, + * The default timeout of 30mins used for unreliable network + * connections is too long for unix domain socket connections. + */ +- ret = rpc_transport_unix_options_build(&options, socketpath, 600); ++ options = dict_new(); ++ if (!options) ++ goto out; ++ ++ ret = rpc_transport_unix_options_build(options, socketpath, 600); + if (ret) + goto out; + +@@ -1999,7 +2003,8 @@ glusterd_brick_connect(glusterd_volinfo_t *volinfo, + brickinfo->rpc = rpc; + } + out: +- ++ if (options) ++ dict_unref(options); + gf_msg_debug("glusterd", 0, "Returning %d", ret); + return ret; + } +diff --git a/xlators/mgmt/glusterd/src/glusterd.c b/xlators/mgmt/glusterd/src/glusterd.c +index 89afb9c..d4ab630 100644 +--- a/xlators/mgmt/glusterd/src/glusterd.c ++++ b/xlators/mgmt/glusterd/src/glusterd.c +@@ -1111,11 +1111,15 @@ glusterd_init_uds_listener(xlator_t *this) + + GF_ASSERT(this); + ++ options = dict_new(); ++ if (!options) ++ goto out; ++ + sock_data = dict_get(this->options, "glusterd-sockfile"); + (void)snprintf(sockfile, sizeof(sockfile), "%s", + sock_data ? sock_data->data : DEFAULT_GLUSTERD_SOCKFILE); + +- ret = rpcsvc_transport_unix_options_build(&options, sockfile); ++ ret = rpcsvc_transport_unix_options_build(options, sockfile); + if (ret) + goto out; + +diff --git a/xlators/nfs/server/src/acl3.c b/xlators/nfs/server/src/acl3.c +index 0eca45d..2ede24b 100644 +--- a/xlators/nfs/server/src/acl3.c ++++ b/xlators/nfs/server/src/acl3.c +@@ -787,9 +787,14 @@ acl3svc_init(xlator_t *nfsx) + goto err; + } + ++ if (options) ++ dict_unref(options); ++ + acl3_inited = _gf_true; + return &acl3prog; + err: ++ if (options) ++ dict_unref(options); + return NULL; + } + +diff --git a/xlators/nfs/server/src/mount3.c b/xlators/nfs/server/src/mount3.c +index 726dc29..396809c 100644 +--- a/xlators/nfs/server/src/mount3.c ++++ b/xlators/nfs/server/src/mount3.c +@@ -4102,8 +4102,13 @@ mnt3svc_init(xlator_t *nfsx) + gf_msg_debug(GF_MNT, GF_LOG_DEBUG, "Thread creation failed"); + } + } ++ if (options) ++ dict_unref(options); ++ + return &mnt3prog; + err: ++ if (options) ++ dict_unref(options); + return NULL; + } + +diff --git a/xlators/nfs/server/src/nlm4.c b/xlators/nfs/server/src/nlm4.c +index a341ebd..c3c1453 100644 +--- a/xlators/nfs/server/src/nlm4.c ++++ b/xlators/nfs/server/src/nlm4.c +@@ -1121,6 +1121,8 @@ nlm4_establish_callback(nfs3_call_state_t *cs, call_frame_t *cbk_frame) + ret = 0; + + err: ++ if (options) ++ dict_unref(options); + if (ret == -1) { + if (rpc_clnt) + rpc_clnt_unref(rpc_clnt); +@@ -2708,8 +2710,13 @@ nlm4svc_init(xlator_t *nfsx) + + gf_timer_call_after(nfsx->ctx, timeout, nlm_grace_period_over, NULL); + nlm4_inited = _gf_true; ++ ++ if (options) ++ dict_unref(options); + return &nlm4prog; + err: ++ if (options) ++ dict_unref(options); + return NULL; + } + +-- +1.8.3.1 + |