ASoC: Intel: Skylake: Fix the memory overwrite of tlv buffer
authorVinod Koul <vinod.koul@intel.com>
Wed, 3 Feb 2016 12:29:44 +0000 (17:59 +0530)
committerMark Brown <broonie@kernel.org>
Thu, 4 Feb 2016 11:36:14 +0000 (11:36 +0000)
TLV buffer can be smaller than the module data, so update the
size of data to be copied before doing the copy.

Also TLV header consists of two unsigned ints, this is also taken
into account here and size modified to reflect this

Suggested-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/skylake/skl-topology.c

index c7816d52ad0852205623c646b273d99a6832b15f..c67e3acb81022371622e6097d38d6cb8cf3ebc27 100644 (file)
@@ -916,6 +916,13 @@ static int skl_tplg_tlv_control_get(struct snd_kcontrol *kcontrol,
                skl_get_module_params(skl->skl_sst, (u32 *)bc->params,
                                      bc->max, bc->param_id, mconfig);
 
+       /* decrement size for TLV header */
+       size -= 2 * sizeof(u32);
+
+       /* check size as we don't want to send kernel data */
+       if (size > bc->max)
+               size = bc->max;
+
        if (bc->params) {
                if (copy_to_user(data, &bc->param_id, sizeof(u32)))
                        return -EFAULT;