From 5f42a71745edc95bc5680e98ce0fd2b950054ea0 Mon Sep 17 00:00:00 2001 From: Chunyang Hui Date: Wed, 23 Oct 2019 21:19:13 +0800 Subject: [PATCH] opal: Fix get locking range info memory leak Previously, get locking range info will allocate memory everytime. Thus calling this function multiple times will cause memory leak. Now, we allocate only if it is NULL. If it is not, then we just memset to zero. Change-Id: If048416a2056176f86206a33e2b5db210288fe4f Signed-off-by: Chunyang Hui Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/472112 Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto Reviewed-by: Changpeng Liu --- lib/nvme/nvme_opal.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/nvme/nvme_opal.c b/lib/nvme/nvme_opal.c index 3d1503cf9..94d27ecd9 100644 --- a/lib/nvme/nvme_opal.c +++ b/lib/nvme/nvme_opal.c @@ -1612,15 +1612,20 @@ opal_get_locking_range_info(struct spdk_opal_dev *dev, return err; } - info = calloc(1, sizeof(struct spdk_opal_locking_range_info)); - if (info == NULL) { - SPDK_ERRLOG("Memory allocation failed for spdk_opal_locking_range_info\n"); - return -ENOMEM; + if (dev->locking_range_info[locking_range_id] == NULL) { + info = calloc(1, sizeof(struct spdk_opal_locking_range_info)); + if (info == NULL) { + SPDK_ERRLOG("Memory allocation failed for spdk_opal_locking_range_info\n"); + return -ENOMEM; + } + info->locking_range_id = locking_range_id; + dev->locking_range_info[locking_range_id] = info; + } else { + info = dev->locking_range_info[locking_range_id]; + memset(info, 0, sizeof(*info)); + info->locking_range_id = locking_range_id; } - info->locking_range_id = locking_range_id; - dev->locking_range_info[locking_range_id] = info; - opal_clear_cmd(dev); opal_set_comid(dev, dev->comid);