ASoC: SOF: control: fix size checks for volatile ext_bytes control .get()
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Mon, 21 Sep 2020 11:08:11 +0000 (14:08 +0300)
committerMark Brown <broonie@kernel.org>
Mon, 21 Sep 2020 22:14:46 +0000 (23:14 +0100)
Mirror addition of checks for regular ext_bytes controls.

Fixes: 783560d02dd61 ('ASoC: SOF: Implement snd_sof_bytes_ext_volatile_get kcontrol IO')
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-3-kai.vehmanen@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/control.c

index 8d499d0..9465611 100644 (file)
@@ -369,6 +369,14 @@ int snd_sof_bytes_ext_volatile_get(struct snd_kcontrol *kcontrol, unsigned int _
        int ret;
        int err;
 
+       /*
+        * Decrement the limit by ext bytes header size to
+        * ensure the user space buffer is not exceeded.
+        */
+       if (size < sizeof(struct snd_ctl_tlv))
+               return -ENOSPC;
+       size -= sizeof(struct snd_ctl_tlv);
+
        ret = pm_runtime_get_sync(scomp->dev);
        if (ret < 0 && ret != -EACCES) {
                dev_err_ratelimited(scomp->dev, "error: bytes_ext get failed to resume %d\n", ret);
@@ -396,6 +404,12 @@ int snd_sof_bytes_ext_volatile_get(struct snd_kcontrol *kcontrol, unsigned int _
 
        data_size = cdata->data->size + sizeof(const struct sof_abi_hdr);
 
+       /* make sure we don't exceed size provided by user space for data */
+       if (data_size > size) {
+               ret = -ENOSPC;
+               goto out;
+       }
+
        header.numid = scontrol->cmd;
        header.length = data_size;
        if (copy_to_user(tlvd, &header, sizeof(const struct snd_ctl_tlv))) {