From 414d3e92fc56f08e320a3aa65b6b18e65b384551 Mon Sep 17 00:00:00 2001 From: N Balachandran Date: Thu, 24 Aug 2017 13:39:07 +0530 Subject: 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 Reviewed-on: https://review.gluster.org/18115 Smoke: Gluster Build System Reviewed-by: Amar Tumballi Tested-by: Raghavendra G CentOS-regression: Gluster Build System Reviewed-by: Raghavendra G --- xlators/performance/quick-read/src/quick-read.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'xlators/performance/quick-read/src') diff --git a/xlators/performance/quick-read/src/quick-read.c b/xlators/performance/quick-read/src/quick-read.c index 8edf495fcdd..92b2f8266ea 100644 --- a/xlators/performance/quick-read/src/quick-read.c +++ b/xlators/performance/quick-read/src/quick-read.c @@ -268,17 +268,19 @@ qr_content_extract (dict_t *xdata) data_t *data = NULL; void *content = NULL; - data = dict_get (xdata, GF_CONTENT_KEY); + dict_get_with_ref (xdata, GF_CONTENT_KEY, &data); if (!data) return NULL; content = GF_CALLOC (1, data->len, gf_qr_mt_content_t); if (!content) - return NULL; + goto out; memcpy (content, data->data, data->len); - return content; +out: + data_unref (data); + return content; } -- cgit