Commit eca61be4 authored by Geoffrey D. Bennett's avatar Geoffrey D. Bennett Committed by Yu Liao
Browse files

ALSA: scarlett2: Add missing error checks to *_ctl_get()

stable inclusion
from stable-v5.15.148
commit 3a09488f4f67f7ade59b8ac62a6c7fb29439cf51
category: bugfix
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I9Q9F0
CVE: CVE-2023-52680

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=3a09488f4f67f7ade59b8ac62a6c7fb29439cf51



--------------------------------

[ Upstream commit 50603a67daef161c78c814580d57f7f0be57167e ]

The *_ctl_get() functions which call scarlett2_update_*() were not
checking the return value. Fix to check the return value and pass to
the caller.

Signed-off-by: default avatarGeoffrey D. Bennett <g@b4.vu>
Fixes: 9e4d5c1b ("ALSA: usb-audio: Scarlett Gen 2 mixer interface")
Link: https://lore.kernel.org/r/32a5fdc83b05fa74e0fcdd672fbf71d75c5f0a6d.1703001053.git.g@b4.vu


Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
Conflicts:
	sound/usb/mixer_scarlett_gen2.c
[Follow the patch logic and adapt the patch.]
Signed-off-by: default avatarYu Liao <liaoyu15@huawei.com>
parent c6a9bc2d
Loading
Loading
Loading
Loading
+30 −13
Original line number Diff line number Diff line
@@ -1032,14 +1032,20 @@ static int scarlett2_master_volume_ctl_get(struct snd_kcontrol *kctl,
	struct usb_mixer_elem_info *elem = kctl->private_data;
	struct usb_mixer_interface *mixer = elem->head.mixer;
	struct scarlett2_mixer_data *private = mixer->private_data;
	int err = 0;

	mutex_lock(&private->data_mutex);
	if (private->vol_updated)
		scarlett2_update_volumes(mixer);
	mutex_unlock(&private->data_mutex);
	if (private->vol_updated) {
		err = scarlett2_update_volumes(mixer);
		if (err < 0)
			goto unlock;
	}

	ucontrol->value.integer.value[0] = private->master_vol;
	return 0;

unlock:
	mutex_unlock(&private->data_mutex);
	return err;
}

static int scarlett2_volume_ctl_get(struct snd_kcontrol *kctl,
@@ -1049,14 +1055,19 @@ static int scarlett2_volume_ctl_get(struct snd_kcontrol *kctl,
	struct usb_mixer_interface *mixer = elem->head.mixer;
	struct scarlett2_mixer_data *private = mixer->private_data;
	int index = elem->control;
	int err = 0;

	mutex_lock(&private->data_mutex);
	if (private->vol_updated)
		scarlett2_update_volumes(mixer);
	mutex_unlock(&private->data_mutex);

	if (private->vol_updated) {
		err = scarlett2_update_volumes(mixer);
		if (err < 0)
			goto unlock;
	}
	ucontrol->value.integer.value[0] = private->vol[index];
	return 0;

unlock:
	mutex_unlock(&private->data_mutex);
	return err;
}

static int scarlett2_volume_ctl_put(struct snd_kcontrol *kctl,
@@ -1322,14 +1333,20 @@ static int scarlett2_button_ctl_get(struct snd_kcontrol *kctl,
	struct usb_mixer_elem_info *elem = kctl->private_data;
	struct usb_mixer_interface *mixer = elem->head.mixer;
	struct scarlett2_mixer_data *private = mixer->private_data;
	int err = 0;

	mutex_lock(&private->data_mutex);
	if (private->vol_updated)
		scarlett2_update_volumes(mixer);
	mutex_unlock(&private->data_mutex);
	if (private->vol_updated) {
		err = scarlett2_update_volumes(mixer);
		if (err < 0)
			goto unlock;
	}

	ucontrol->value.enumerated.item[0] = private->buttons[elem->control];
	return 0;

unlock:
	mutex_unlock(&private->data_mutex);
	return err;
}

static int scarlett2_button_ctl_put(struct snd_kcontrol *kctl,