Unverified Commit b5d057a8 authored by Richard Fitzgerald's avatar Richard Fitzgerald Committed by Mark Brown
Browse files

ASoC: wm_adsp: Use vmemdup_user() instead of open-coding



Use vmemdup_user() to get a copy of the user buffer in wm_coeff_tlv_put().

Apart from simplifying the code and avoiding open-coding, it means we
also automatically benefit from any security enhancements in the code
behind vmemdup_user().

Signed-off-by: default avatarRichard Fitzgerald <rf@opensource.cirrus.com>
Link: https://patch.msgid.link/20250410101812.1180539-1-rf@opensource.cirrus.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent f4f20f7a
Loading
Loading
Loading
Loading
+6 −14
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@
 */

#include <linux/array_size.h>
#include <linux/cleanup.h>
#include <linux/ctype.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
@@ -19,7 +20,7 @@
#include <linux/regmap.h>
#include <linux/regulator/consumer.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>
#include <linux/string.h>
#include <linux/workqueue.h>
#include <linux/debugfs.h>
#include <sound/core.h>
@@ -415,21 +416,12 @@ static int wm_coeff_tlv_put(struct snd_kcontrol *kctl,
		(struct soc_bytes_ext *)kctl->private_value;
	struct wm_coeff_ctl *ctl = bytes_ext_to_ctl(bytes_ext);
	struct cs_dsp_coeff_ctl *cs_ctl = ctl->cs_ctl;
	void *scratch;
	int ret = 0;
	void *scratch __free(kvfree) = vmemdup_user(bytes, size);

	scratch = vmalloc(size);
	if (!scratch)
		return -ENOMEM;
	if (IS_ERR(scratch))
		return PTR_ERR(no_free_ptr(scratch));

	if (copy_from_user(scratch, bytes, size))
		ret = -EFAULT;
	else
		ret = cs_dsp_coeff_lock_and_write_ctrl(cs_ctl, 0, scratch, size);

	vfree(scratch);

	return ret;
	return cs_dsp_coeff_lock_and_write_ctrl(cs_ctl, 0, scratch, size);
}

static int wm_coeff_put_acked(struct snd_kcontrol *kctl,