d2787b
From 59c05230c0df58765e30553c66bbcc0c9965d362 Mon Sep 17 00:00:00 2001
d2787b
From: nik-redhat <nladha@redhat.com>
d2787b
Date: Tue, 11 Aug 2020 23:12:26 +0530
d2787b
Subject: [PATCH 597/610] glusterd: memory deallocated twice
d2787b
d2787b
Issue:
d2787b
If the the pointer tmptier is destroyed in the function
d2787b
code it still it checks for the same in the out label.
d2787b
And tries to destroy the same pointer again.
d2787b
d2787b
Fix:
d2787b
So, instead of passing the ptr by value, if we
d2787b
pass it by reference then, on making the ptr in the
d2787b
function the value will persist, in the calling
d2787b
function and next time when the gf_store_iter_destory()
d2787b
is called it won't try to free the ptr again.
d2787b
d2787b
CID: 1430122
d2787b
d2787b
>Updates: #1060
d2787b
d2787b
>Change-Id: I019cea8e301c7cc87be792c03b58722fc96f04ef
d2787b
>Signed-off-by: nik-redhat <nladha@redhat.com>
d2787b
d2787b
Upstream link: https://review.gluster.org/c/glusterfs/+/24855
d2787b
BUG: 1997447
d2787b
d2787b
Change-Id: Ib403efd08d47a69d25f291ae61c9cbfcaaa05da8
d2787b
Signed-off-by: nik-redhat <nladha@redhat.com>
d2787b
Reviewed-on: https://code.engineering.redhat.com/gerrit/c/rhs-glusterfs/+/280076
d2787b
Tested-by: RHGS Build Bot <nigelb@redhat.com>
d2787b
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
d2787b
---
d2787b
 libglusterfs/src/glusterfs/store.h         |  2 +-
d2787b
 libglusterfs/src/store.c                   | 12 +++++++-----
d2787b
 xlators/mgmt/glusterd/src/glusterd-store.c | 16 ++++++++--------
d2787b
 3 files changed, 16 insertions(+), 14 deletions(-)
d2787b
d2787b
diff --git a/libglusterfs/src/glusterfs/store.h b/libglusterfs/src/glusterfs/store.h
d2787b
index 68a20ad..76af2df 100644
d2787b
--- a/libglusterfs/src/glusterfs/store.h
d2787b
+++ b/libglusterfs/src/glusterfs/store.h
d2787b
@@ -93,7 +93,7 @@ int32_t
d2787b
 gf_store_iter_get_matching(gf_store_iter_t *iter, char *key, char **value);
d2787b
 
d2787b
 int32_t
d2787b
-gf_store_iter_destroy(gf_store_iter_t *iter);
d2787b
+gf_store_iter_destroy(gf_store_iter_t **iter);
d2787b
 
d2787b
 char *
d2787b
 gf_store_strerror(gf_store_op_errno_t op_errno);
d2787b
diff --git a/libglusterfs/src/store.c b/libglusterfs/src/store.c
d2787b
index 3af627a..e4931bf 100644
d2787b
--- a/libglusterfs/src/store.c
d2787b
+++ b/libglusterfs/src/store.c
d2787b
@@ -606,23 +606,25 @@ out:
d2787b
 }
d2787b
 
d2787b
 int32_t
d2787b
-gf_store_iter_destroy(gf_store_iter_t *iter)
d2787b
+gf_store_iter_destroy(gf_store_iter_t **iter)
d2787b
 {
d2787b
     int32_t ret = -1;
d2787b
 
d2787b
-    if (!iter)
d2787b
+    if (!(*iter))
d2787b
         return 0;
d2787b
 
d2787b
     /* gf_store_iter_new will not return a valid iter object with iter->file
d2787b
      * being NULL*/
d2787b
-    ret = fclose(iter->file);
d2787b
+    ret = fclose((*iter)->file);
d2787b
     if (ret)
d2787b
         gf_msg("", GF_LOG_ERROR, errno, LG_MSG_FILE_OP_FAILED,
d2787b
                "Unable"
d2787b
                " to close file: %s, ret: %d",
d2787b
-               iter->filepath, ret);
d2787b
+               (*iter)->filepath, ret);
d2787b
+
d2787b
+    GF_FREE(*iter);
d2787b
+    *iter = NULL;
d2787b
 
d2787b
-    GF_FREE(iter);
d2787b
     return ret;
d2787b
 }
d2787b
 
d2787b
diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c
d2787b
index a8651d8..e027575 100644
d2787b
--- a/xlators/mgmt/glusterd/src/glusterd-store.c
d2787b
+++ b/xlators/mgmt/glusterd/src/glusterd-store.c
d2787b
@@ -2576,7 +2576,7 @@ glusterd_store_retrieve_snapd(glusterd_volinfo_t *volinfo)
d2787b
     ret = 0;
d2787b
 
d2787b
 out:
d2787b
-    if (gf_store_iter_destroy(iter)) {
d2787b
+    if (gf_store_iter_destroy(&iter)) {
d2787b
         gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_STORE_ITER_DESTROY_FAIL,
d2787b
                "Failed to destroy store iter");
d2787b
         ret = -1;
d2787b
@@ -2895,13 +2895,13 @@ glusterd_store_retrieve_bricks(glusterd_volinfo_t *volinfo)
d2787b
     ret = 0;
d2787b
 
d2787b
 out:
d2787b
-    if (gf_store_iter_destroy(tmpiter)) {
d2787b
+    if (gf_store_iter_destroy(&tmpiter)) {
d2787b
         gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_STORE_ITER_DESTROY_FAIL,
d2787b
                "Failed to destroy store iter");
d2787b
         ret = -1;
d2787b
     }
d2787b
 
d2787b
-    if (gf_store_iter_destroy(iter)) {
d2787b
+    if (gf_store_iter_destroy(&iter)) {
d2787b
         gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_STORE_ITER_DESTROY_FAIL,
d2787b
                "Failed to destroy store iter");
d2787b
         ret = -1;
d2787b
@@ -3067,7 +3067,7 @@ glusterd_store_retrieve_node_state(glusterd_volinfo_t *volinfo)
d2787b
     ret = 0;
d2787b
 
d2787b
 out:
d2787b
-    if (gf_store_iter_destroy(iter)) {
d2787b
+    if (gf_store_iter_destroy(&iter)) {
d2787b
         gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_STORE_ITER_DESTROY_FAIL,
d2787b
                "Failed to destroy store iter");
d2787b
         ret = -1;
d2787b
@@ -3379,7 +3379,7 @@ glusterd_store_update_volinfo(glusterd_volinfo_t *volinfo)
d2787b
     ret = 0;
d2787b
 
d2787b
 out:
d2787b
-    if (gf_store_iter_destroy(iter)) {
d2787b
+    if (gf_store_iter_destroy(&iter)) {
d2787b
         gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_STORE_ITER_DESTROY_FAIL,
d2787b
                "Failed to destroy store iter");
d2787b
         ret = -1;
d2787b
@@ -3574,7 +3574,7 @@ glusterd_store_retrieve_options(xlator_t *this)
d2787b
         goto out;
d2787b
     ret = 0;
d2787b
 out:
d2787b
-    (void)gf_store_iter_destroy(iter);
d2787b
+    (void)gf_store_iter_destroy(&iter);
d2787b
     gf_store_handle_destroy(shandle);
d2787b
     return ret;
d2787b
 }
d2787b
@@ -4026,7 +4026,7 @@ glusterd_store_update_snap(glusterd_snap_t *snap)
d2787b
     ret = 0;
d2787b
 
d2787b
 out:
d2787b
-    if (gf_store_iter_destroy(iter)) {
d2787b
+    if (gf_store_iter_destroy(&iter)) {
d2787b
         gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_STORE_ITER_DESTROY_FAIL,
d2787b
                "Failed to destroy store iter");
d2787b
         ret = -1;
d2787b
@@ -4774,7 +4774,7 @@ glusterd_store_retrieve_peers(xlator_t *this)
d2787b
         is_ok = _gf_true;
d2787b
 
d2787b
     next:
d2787b
-        (void)gf_store_iter_destroy(iter);
d2787b
+        (void)gf_store_iter_destroy(&iter);
d2787b
 
d2787b
         if (!is_ok) {
d2787b
             gf_log(this->name, GF_LOG_WARNING,
d2787b
-- 
d2787b
1.8.3.1
d2787b