diff options
| author | N Balachandran <nbalacha@redhat.com> | 2017-05-19 15:22:12 +0530 | 
|---|---|---|
| committer | Shyamsundar Ranganathan <srangana@redhat.com> | 2017-05-19 19:44:51 +0000 | 
| commit | 17784aaa311494e4538c616f02bf95477ae781bc (patch) | |
| tree | 84a71417648a6deecaf0acaf5676088df0b79c2e | |
| parent | 30ed04dc49305f3c0f87ff6010f2fdeb816fbdcc (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.
Change-Id: I24f49b6dbd29a2b706e388e2f6d5196c0f80afc5
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>
| -rw-r--r-- | xlators/cluster/dht/src/dht-selfheal.c | 8 | 
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) {  | 
