diff options
| author | N Balachandran <nbalacha@redhat.com> | 2017-08-24 13:39:07 +0530 | 
|---|---|---|
| committer | Raghavendra G <rgowdapp@redhat.com> | 2017-08-28 06:42:27 +0000 | 
| commit | 414d3e92fc56f08e320a3aa65b6b18e65b384551 (patch) | |
| tree | d4897cf1f8b81260752777bf8545c034734493a7 /libglusterfs/src | |
| parent | ea48cae5df118d9b901e7d79cd8726b6f38d65a0 (diff) | |
perf/qr: Use a ref-ed data to extract content
qr_content_extract used dict_get to get the value of
the GF_CONTENT_KEY key. dict_get does not ref the data
before returning it so QR could be acting on freed memory
if another thread deletes the key before then.
This patch also fixes a race in dict_get_with_ref.
Fix: Use dict_get_with_ref to retrieve the file contents.
Change-Id: Ib1a7a70bb92eed7e70747ec530e0b3edc53127ec
BUG: 1484709
Signed-off-by: N Balachandran <nbalacha@redhat.com>
Reviewed-on: https://review.gluster.org/18115
Smoke: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Amar Tumballi <amarts@redhat.com>
Tested-by: Raghavendra G <rgowdapp@redhat.com>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
Diffstat (limited to 'libglusterfs/src')
| -rw-r--r-- | libglusterfs/src/dict.c | 13 | ||||
| -rw-r--r-- | libglusterfs/src/dict.h | 1 | 
2 files changed, 7 insertions, 7 deletions
diff --git a/libglusterfs/src/dict.c b/libglusterfs/src/dict.c index 22bf3f99d70..c4f3fb71de3 100644 --- a/libglusterfs/src/dict.c +++ b/libglusterfs/src/dict.c @@ -1433,7 +1433,7 @@ fail:   */ -static int +int  dict_get_with_ref (dict_t *this, char *key, data_t **data)  {          data_pair_t * pair = NULL; @@ -1453,14 +1453,13 @@ dict_get_with_ref (dict_t *this, char *key, data_t **data)          LOCK (&this->lock);          {                  pair = dict_lookup_common (this, key, hash); -        } -        UNLOCK (&this->lock); -        if (pair) { -                ret = 0; -                *data = data_ref (pair->value); +                if (pair) { +                        ret = 0; +                        *data = data_ref (pair->value); +                 }          } - +        UNLOCK (&this->lock);  err:          return ret;  } diff --git a/libglusterfs/src/dict.h b/libglusterfs/src/dict.h index 93ffa3e8cc7..b1313636092 100644 --- a/libglusterfs/src/dict.h +++ b/libglusterfs/src/dict.h @@ -105,6 +105,7 @@ int32_t dict_set (dict_t *this, char *key, data_t *value);  /* function to set a new key/value pair (without checking for duplicate) */  int32_t dict_add (dict_t *this, char *key, data_t *value); +int dict_get_with_ref (dict_t *this, char *key, data_t **data);  data_t *dict_get (dict_t *this, char *key);  void dict_del (dict_t *this, char *key);  int dict_reset (dict_t *dict);  | 
