Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b2af4d10 authored by Yuanfang Zhang's avatar Yuanfang Zhang Committed by Gerrit - the friendly Code Review server
Browse files

qdss_bridge: fix memory leak issue



Free the entry of read_done_list when mhi_queue_inbound fail and
read finish.

Change-Id: I738012310671e50a6d461aa9e755a255dd75c83b
Signed-off-by: default avatarYuanfang Zhang <zhangyuanfang@codeaurora.org>
parent 05d7be5f
Loading
Loading
Loading
Loading
+5 −7
Original line number Original line Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
// SPDX-License-Identifier: GPL-2.0-only
/*
/*
 * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
 * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
 */
 */


#define KMSG_COMPONENT "QDSS diag bridge"
#define KMSG_COMPONENT "QDSS diag bridge"
@@ -510,14 +510,10 @@ static int mhi_ch_open(struct qdss_bridge_drvdata *drvdata)
	ret = mhi_prepare_for_transfer(drvdata->mhi_dev);
	ret = mhi_prepare_for_transfer(drvdata->mhi_dev);
	if (ret) {
	if (ret) {
		pr_err("Unable to open MHI channel\n");
		pr_err("Unable to open MHI channel\n");
		goto err;
		return ret;
	}
	}


	return 0;
	return 0;
err:
	spin_lock_bh(&drvdata->lock);
	spin_unlock_bh(&drvdata->lock);
	return ret;
}
}


static void qdss_bridge_open_work_fn(struct work_struct *work)
static void qdss_bridge_open_work_fn(struct work_struct *work)
@@ -713,9 +709,10 @@ static ssize_t mhi_uci_read(struct file *file,
			pr_err("Failed to recycle element, ret: %d\n", ret);
			pr_err("Failed to recycle element, ret: %d\n", ret);
			qdss_del_buf_tbl_entry(drvdata, uci_buf->buf);
			qdss_del_buf_tbl_entry(drvdata, uci_buf->buf);
			uci_buf->buf = NULL;
			uci_buf->buf = NULL;
			uci_buf = NULL;
			kfree(uci_buf);
			return ret;
			return ret;
		}
		}
		kfree(uci_buf);
	}
	}


	pr_debug("Returning %lu bytes\n", to_copy);
	pr_debug("Returning %lu bytes\n", to_copy);
@@ -797,6 +794,7 @@ static int mhi_uci_open(struct inode *inode, struct file *filp)
	list_for_each_entry_safe(buf_itr, tmp, &drvdata->read_done_list, link) {
	list_for_each_entry_safe(buf_itr, tmp, &drvdata->read_done_list, link) {
		list_del(&buf_itr->link);
		list_del(&buf_itr->link);
		kfree(buf_itr->buf);
		kfree(buf_itr->buf);
		kfree(buf_itr);
	}
	}


error_open_chan:
error_open_chan: