mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-24 06:30:53 +07:00
ASoC: SOF: control: add size checks for ext_bytes control .put()
Make sure the TLV header and size are consistent before copying from
userspace.
Fixes: c3078f5397
('ASoC: SOF: Add Sound Open Firmware KControl support')
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://lore.kernel.org/r/20200921110814.2910477-4-kai.vehmanen@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
ec5a97624a
commit
2ca210112a
@ -300,6 +300,10 @@ int snd_sof_bytes_ext_put(struct snd_kcontrol *kcontrol,
|
||||
const struct snd_ctl_tlv __user *tlvd =
|
||||
(const struct snd_ctl_tlv __user *)binary_data;
|
||||
|
||||
/* make sure we have at least a header */
|
||||
if (size < sizeof(struct snd_ctl_tlv))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* The beginning of bytes data contains a header from where
|
||||
* the length (as bytes) is needed to know the correct copy
|
||||
@ -308,6 +312,13 @@ int snd_sof_bytes_ext_put(struct snd_kcontrol *kcontrol,
|
||||
if (copy_from_user(&header, tlvd, sizeof(const struct snd_ctl_tlv)))
|
||||
return -EFAULT;
|
||||
|
||||
/* make sure TLV info is consistent */
|
||||
if (header.length + sizeof(struct snd_ctl_tlv) > size) {
|
||||
dev_err_ratelimited(scomp->dev, "error: inconsistent TLV, data %d + header %zu > %d\n",
|
||||
header.length, sizeof(struct snd_ctl_tlv), size);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* be->max is coming from topology */
|
||||
if (header.length > be->max) {
|
||||
dev_err_ratelimited(scomp->dev, "error: Bytes data size %d exceeds max %d.\n",
|
||||
|
Loading…
Reference in New Issue
Block a user