[PATCH v2] ASoC: core: clarify the driver name initialization
Nícolas F. R. A. Prado
nfraprado at collabora.com
Thu Sep 29 18:09:52 CEST 2022
Hi,
On Thu, Sep 29, 2022 at 04:37:54PM +0200, Jaroslav Kysela wrote:
> The driver field in the struct snd_ctl_card_info is a valid
> user space identifier. Actually, many ASoC drivers do not care
> and let to initialize this field using a standard wrapping method.
> Unfortunately, in this way, this field becomes unusable and
> unreadable for the drivers with longer card names. Also,
> there is a possibility to have clashes (driver field has
> only limit of 15 characters).
>
> This change will print an error when the wrapping is used.
> The developers of the affected drivers should fix the problem.
>
> Signed-off-by: Jaroslav Kysela <perex at perex.cz>
>
> v1..v2:
> - remove the wrong DMI condition per Mark's review
> ---
> sound/soc/soc-core.c | 37 +++++++++++++++++++++++--------------
> 1 file changed, 23 insertions(+), 14 deletions(-)
>
> diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
> index e824ff1a9fc0..590143ebf6df 100644
> --- a/sound/soc/soc-core.c
> +++ b/sound/soc/soc-core.c
> @@ -1840,21 +1840,22 @@ static void soc_check_tplg_fes(struct snd_soc_card *card)
> }
> }
>
> -#define soc_setup_card_name(name, name1, name2, norm) \
> - __soc_setup_card_name(name, sizeof(name), name1, name2, norm)
> -static void __soc_setup_card_name(char *name, int len,
> - const char *name1, const char *name2,
> - int normalization)
> +#define soc_setup_card_name(card, name, name1, name2) \
> + __soc_setup_card_name(card, name, sizeof(name), name1, name2)
> +static void __soc_setup_card_name(struct snd_soc_card *card,
> + char *name, int len,
> + const char *name1, const char *name2)
> {
> + const char *src = name1 ? name1 : name2;
> int i;
>
> - snprintf(name, len, "%s", name1 ? name1 : name2);
> + snprintf(name, len, "%s", src);
>
> - if (!normalization)
> + if (name != card->snd_card->driver)
> return;
The changes do more than the commit message implies by also reworking the need
for the normalization flag, and now that you're special casing most of the
function based on a particular pointer, I wonder if splitting the below logic to
a separate function would make more sense.
In any case,
Reviewed-by: Nícolas F. R. A. Prado <nfraprado at collabora.com>
Thanks,
Nícolas
>
> /*
> - * Name normalization
> + * Name normalization (driver field)
> *
> * The driver name is somewhat special, as it's used as a key for
> * searches in the user-space.
> @@ -1874,6 +1875,14 @@ static void __soc_setup_card_name(char *name, int len,
> break;
> }
> }
> +
> + /*
> + * The driver field should contain a valid string from the user view.
> + * The wrapping usually does not work so well here. Set a smaller string
> + * in the specific ASoC driver.
> + */
> + if (strlen(src) > len - 1)
> + dev_err(card->dev, "ASoC: driver name too long '%s' -> '%s'\n", src, name);
> }
>
> static void soc_cleanup_card_resources(struct snd_soc_card *card)
> @@ -2041,12 +2050,12 @@ static int snd_soc_bind_card(struct snd_soc_card *card)
> /* try to set some sane longname if DMI is available */
> snd_soc_set_dmi_name(card, NULL);
>
> - soc_setup_card_name(card->snd_card->shortname,
> - card->name, NULL, 0);
> - soc_setup_card_name(card->snd_card->longname,
> - card->long_name, card->name, 0);
> - soc_setup_card_name(card->snd_card->driver,
> - card->driver_name, card->name, 1);
> + soc_setup_card_name(card, card->snd_card->shortname,
> + card->name, NULL);
> + soc_setup_card_name(card, card->snd_card->longname,
> + card->long_name, card->name);
> + soc_setup_card_name(card, card->snd_card->driver,
> + card->driver_name, card->name);
>
> if (card->components) {
> /* the current implementation of snd_component_add() accepts */
> --
> 2.35.3
>
More information about the Alsa-devel
mailing list