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

Commit ac62c5e0 authored by Divya Ojha's avatar Divya Ojha Committed by Banajit Goswami
Browse files

drivers: qcom: ultrasound: check concurrent device open operations



Make opened device count atomic variable to avoid probable race
condition. Race condition leads to memory leak and list corruption.

Change-Id: I4da98f27d36f616bc8fa7b1a848c20cc7eea04e5
Signed-off-by: default avatarDivya Ojha <dojha@codeaurora.org>
parent b8841c42
Loading
Loading
Loading
Loading
+4 −7
Original line number Diff line number Diff line
@@ -179,7 +179,7 @@ static const int s_button_map[] = {
};

/* The opened devices container */
static int s_opened_devs[MAX_DEVS_NUMBER];
static atomic_t s_opened_devs[MAX_DEVS_NUMBER];

static struct wakeup_source usf_wakeup_source;

@@ -2348,14 +2348,11 @@ static uint16_t add_opened_dev(int minor)
	uint16_t ind = 0;

	for (ind = 0; ind < MAX_DEVS_NUMBER; ++ind) {
		if (minor == s_opened_devs[ind]) {
		if (minor == atomic_cmpxchg(&s_opened_devs[ind], 0, minor)) {
			pr_err("%s: device %d is already opened\n",
			       __func__, minor);
			return USF_UNDEF_DEV_ID;
		}

		if (s_opened_devs[ind] == 0) {
			s_opened_devs[ind] = minor;
		} else {
			pr_debug("%s: device %d is added; ind=%d\n",
				__func__, minor, ind);
			return ind;
@@ -2410,7 +2407,7 @@ static int usf_release(struct inode *inode, struct file *file)
	usf_disable(&usf->usf_tx);
	usf_disable(&usf->usf_rx);

	s_opened_devs[usf->dev_ind] = 0;
	atomic_set(&s_opened_devs[usf->dev_ind], 0);

	wakeup_source_trash(&usf_wakeup_source);
	mutex_unlock(&usf->mutex);