lkml.org 
[lkml]   [2020]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.8 226/633] ASoC: topology: disable size checks for bytes_ext controls if needed
    Date
    From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>

    [ Upstream commit 6788fc1a66a0c1d1cec7a0f84f94b517eae8611c ]

    When CONFIG_SND_CTL_VALIDATION is set, accesses to extended bytes
    control generate spurious error messages when the size exceeds 512
    bytes, such as

    [ 11.224223] sof_sdw sof_sdw: control 2:0:0:EQIIR5.0 eqiir_coef_5:0:
    invalid count 1024

    In addition the error check returns -EINVAL which has the nasty side
    effect of preventing applications accessing controls from working,
    e.g.

    root@plb:~# alsamixer
    cannot load mixer controls: Invalid argument

    It's agreed that the control interface has been abused since 2014, but
    forcing a check should not prevent existing solutions from working.

    This patch skips the checks conditionally if CONFIG_SND_CTL_VALIDATION
    is set and the byte array provided by topology is > 512. This
    preserves the checks for all other cases.

    Fixes: 1a3232d2f61d2 ('ASoC: topology: Add support for TLV bytes controls')
    BugLink: https://github.com/thesofproject/linux/issues/2430
    Reported-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
    Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
    Reviewed-by: Jaska Uimonen <jaska.uimonen@intel.com>
    Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
    Link: https://lore.kernel.org/r/20200917103912.2565907-1-kai.vehmanen@linux.intel.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    sound/soc/soc-topology.c | 11 +++++++++++
    1 file changed, 11 insertions(+)

    diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
    index 6eaa00c210117..a5460155b3f64 100644
    --- a/sound/soc/soc-topology.c
    +++ b/sound/soc/soc-topology.c
    @@ -592,6 +592,17 @@ static int soc_tplg_kcontrol_bind_io(struct snd_soc_tplg_ctl_hdr *hdr,
    k->info = snd_soc_bytes_info_ext;
    k->tlv.c = snd_soc_bytes_tlv_callback;

    + /*
    + * When a topology-based implementation abuses the
    + * control interface and uses bytes_ext controls of
    + * more than 512 bytes, we need to disable the size
    + * checks, otherwise accesses to such controls will
    + * return an -EINVAL error and prevent the card from
    + * being configured.
    + */
    + if (IS_ENABLED(CONFIG_SND_CTL_VALIDATION) && sbe->max > 512)
    + k->access |= SNDRV_CTL_ELEM_ACCESS_SKIP_CHECK;
    +
    ext_ops = tplg->bytes_ext_ops;
    num_ops = tplg->bytes_ext_ops_count;
    for (i = 0; i < num_ops; i++) {
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-10-27 16:06    [W:4.030 / U:0.408 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site