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