summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorN Balachandran <nbalacha@redhat.com>2017-05-19 15:22:12 +0530
committerShyamsundar Ranganathan <srangana@redhat.com>2017-05-22 14:17:58 +0000
commit7ff24a07fa282f987b9e296a5d8308af7afe3443 (patch)
tree358e75fce32f3cca48c256a8bc3e9daa424dbc44
parent671dfcd82f6a7c56fbcbfde33cba22c0b585a046 (diff)
cluster/dht: Fix crash in dht_selfheal_dir_setattr
Use a local variable to store the call cnt used in the for loop for the STACK_WIND so as not to access local which may be freed by STACK_UNWIND after all fops return. > BUG: 1452102 > Signed-off-by: N Balachandran <nbalacha@redhat.com> > Reviewed-on: https://review.gluster.org/17343 > Smoke: Gluster Build System <jenkins@build.gluster.org> > NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> > Reviewed-by: Shyamsundar Ranganathan <srangana@redhat.com> > CentOS-regression: Gluster Build System <jenkins@build.gluster.org> (cherry picked from commit 17784aaa311494e4538c616f02bf95477ae781bc) Change-Id: I24f49b6dbd29a2b706e388e2f6d5196c0f80afc5 BUG: 1453050 Signed-off-by: N Balachandran <nbalacha@redhat.com> Reviewed-on: https://review.gluster.org/17348 Smoke: Gluster Build System <jenkins@build.gluster.org> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.org> Reviewed-by: Shyamsundar Ranganathan <srangana@redhat.com>
-rw-r--r--xlators/cluster/dht/src/dht-selfheal.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/xlators/cluster/dht/src/dht-selfheal.c b/xlators/cluster/dht/src/dht-selfheal.c
index de9d30c047f..1dd5823b0b5 100644
--- a/xlators/cluster/dht/src/dht-selfheal.c
+++ b/xlators/cluster/dht/src/dht-selfheal.c
@@ -1150,6 +1150,7 @@ dht_selfheal_dir_setattr (call_frame_t *frame, loc_t *loc, struct iatt *stbuf,
int i = 0, ret = -1;
dht_local_t *local = NULL;
xlator_t *this = NULL;
+ int cnt = 0;
local = frame->local;
this = frame->this;
@@ -1175,7 +1176,8 @@ dht_selfheal_dir_setattr (call_frame_t *frame, loc_t *loc, struct iatt *stbuf,
gf_uuid_copy (loc->gfid, local->gfid);
local->call_cnt = missing_attr;
- for (i = 0; i < layout->cnt; i++) {
+ cnt = layout->cnt;
+ for (i = 0; i < cnt; i++) {
if (layout->list[i].err == -1) {
gf_msg_trace (this->name, 0,
"%s: setattr on subvol %s, gfid = %s",
@@ -1299,6 +1301,7 @@ dht_selfheal_dir_mkdir_lookup_done (call_frame_t *frame, xlator_t *this)
dict_t *dict = NULL;
dht_layout_t *layout = NULL;
loc_t *loc = NULL;
+ int cnt = 0;
VALIDATE_OR_GOTO (this->private, err);
@@ -1331,7 +1334,8 @@ dht_selfheal_dir_mkdir_lookup_done (call_frame_t *frame, xlator_t *this)
DHT_MSG_DICT_SET_FAILED,
"dict is NULL, need to make sure gfids are same");
- for (i = 0; i < layout->cnt; i++) {
+ cnt = layout->cnt;
+ for (i = 0; i < cnt; i++) {
if (layout->list[i].err == ESTALE ||
layout->list[i].err == ENOENT ||
local->selfheal.force_mkdir) {