Skip to content

Commit 0cc6548

Browse files
jwrdegoedebroonie
authored andcommitted
ASoC: Intel: Boards: Fix NULL pointer deref in BYT/CHT boards harder
Since commit 13f5826 ("ASoC: soc.h: don't create dummy Component via COMP_DUMMY()") dummy codecs declared like this: SND_SOC_DAILINK_DEF(dummy, DAILINK_COMP_ARRAY(COMP_DUMMY())); expand to: static struct snd_soc_dai_link_component dummy[] = { }; Which means that dummy is a zero sized array and thus dais[i].codecs should not be dereferenced *at all* since it points to the address of the next variable stored in the data section as the "dummy" variable has an address but no size, so even dereferencing dais[0] is already an out of bounds array reference. Which means that the if (dais[i].codecs->name) check added in commit 7d99a70 ("ASoC: Intel: Boards: Fix NULL pointer deref in BYT/CHT boards") relies on that the part of the next variable which the name member maps to just happens to be NULL. Which apparently so far it usually is, except when it isn't and then it results in crashes like this one: [ 28.795659] BUG: unable to handle page fault for address: 0000000000030011 ... [ 28.795780] Call Trace: [ 28.795787] <TASK> ... [ 28.795862] ? strcmp+0x18/0x40 [ 28.795872] 0xffffffffc150c605 [ 28.795887] platform_probe+0x40/0xa0 ... [ 28.795979] ? __pfx_init_module+0x10/0x10 [snd_soc_sst_bytcr_wm5102] Really fix things this time around by checking dais.num_codecs != 0. Fixes: 7d99a70 ("ASoC: Intel: Boards: Fix NULL pointer deref in BYT/CHT boards") Cc: [email protected] Signed-off-by: Hans de Goede <[email protected]> Reviewed-by: Pierre-Louis Bossart <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent bb44855 commit 0cc6548

File tree

9 files changed

+9
-9
lines changed

9 files changed

+9
-9
lines changed

sound/soc/intel/boards/bxt_rt298.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -605,7 +605,7 @@ static int broxton_audio_probe(struct platform_device *pdev)
605605
int i;
606606

607607
for (i = 0; i < ARRAY_SIZE(broxton_rt298_dais); i++) {
608-
if (card->dai_link[i].codecs->name &&
608+
if (card->dai_link[i].num_codecs &&
609609
!strncmp(card->dai_link[i].codecs->name, "i2c-INT343A:00",
610610
I2C_NAME_SIZE)) {
611611
if (!strncmp(card->name, "broxton-rt298",

sound/soc/intel/boards/bytcht_cx2072x.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ static int snd_byt_cht_cx2072x_probe(struct platform_device *pdev)
241241

242242
/* fix index of codec dai */
243243
for (i = 0; i < ARRAY_SIZE(byt_cht_cx2072x_dais); i++) {
244-
if (byt_cht_cx2072x_dais[i].codecs->name &&
244+
if (byt_cht_cx2072x_dais[i].num_codecs &&
245245
!strcmp(byt_cht_cx2072x_dais[i].codecs->name,
246246
"i2c-14F10720:00")) {
247247
dai_index = i;

sound/soc/intel/boards/bytcht_da7213.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ static int bytcht_da7213_probe(struct platform_device *pdev)
245245

246246
/* fix index of codec dai */
247247
for (i = 0; i < ARRAY_SIZE(dailink); i++) {
248-
if (dailink[i].codecs->name &&
248+
if (dailink[i].num_codecs &&
249249
!strcmp(dailink[i].codecs->name, "i2c-DLGS7213:00")) {
250250
dai_index = i;
251251
break;

sound/soc/intel/boards/bytcht_es8316.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -546,7 +546,7 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
546546

547547
/* fix index of codec dai */
548548
for (i = 0; i < ARRAY_SIZE(byt_cht_es8316_dais); i++) {
549-
if (byt_cht_es8316_dais[i].codecs->name &&
549+
if (byt_cht_es8316_dais[i].num_codecs &&
550550
!strcmp(byt_cht_es8316_dais[i].codecs->name,
551551
"i2c-ESSX8316:00")) {
552552
dai_index = i;

sound/soc/intel/boards/bytcr_rt5640.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1677,7 +1677,7 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
16771677

16781678
/* fix index of codec dai */
16791679
for (i = 0; i < ARRAY_SIZE(byt_rt5640_dais); i++) {
1680-
if (byt_rt5640_dais[i].codecs->name &&
1680+
if (byt_rt5640_dais[i].num_codecs &&
16811681
!strcmp(byt_rt5640_dais[i].codecs->name,
16821682
"i2c-10EC5640:00")) {
16831683
dai_index = i;

sound/soc/intel/boards/bytcr_rt5651.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -910,7 +910,7 @@ static int snd_byt_rt5651_mc_probe(struct platform_device *pdev)
910910

911911
/* fix index of codec dai */
912912
for (i = 0; i < ARRAY_SIZE(byt_rt5651_dais); i++) {
913-
if (byt_rt5651_dais[i].codecs->name &&
913+
if (byt_rt5651_dais[i].num_codecs &&
914914
!strcmp(byt_rt5651_dais[i].codecs->name,
915915
"i2c-10EC5651:00")) {
916916
dai_index = i;

sound/soc/intel/boards/bytcr_wm5102.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -605,7 +605,7 @@ static int snd_byt_wm5102_mc_probe(struct platform_device *pdev)
605605

606606
/* find index of codec dai */
607607
for (i = 0; i < ARRAY_SIZE(byt_wm5102_dais); i++) {
608-
if (byt_wm5102_dais[i].codecs->name &&
608+
if (byt_wm5102_dais[i].num_codecs &&
609609
!strcmp(byt_wm5102_dais[i].codecs->name,
610610
"wm5102-codec")) {
611611
dai_index = i;

sound/soc/intel/boards/cht_bsw_rt5645.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -569,7 +569,7 @@ static int snd_cht_mc_probe(struct platform_device *pdev)
569569

570570
/* set correct codec name */
571571
for (i = 0; i < ARRAY_SIZE(cht_dailink); i++)
572-
if (cht_dailink[i].codecs->name &&
572+
if (cht_dailink[i].num_codecs &&
573573
!strcmp(cht_dailink[i].codecs->name,
574574
"i2c-10EC5645:00")) {
575575
dai_index = i;

sound/soc/intel/boards/cht_bsw_rt5672.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -466,7 +466,7 @@ static int snd_cht_mc_probe(struct platform_device *pdev)
466466

467467
/* find index of codec dai */
468468
for (i = 0; i < ARRAY_SIZE(cht_dailink); i++) {
469-
if (cht_dailink[i].codecs->name &&
469+
if (cht_dailink[i].num_codecs &&
470470
!strcmp(cht_dailink[i].codecs->name, RT5672_I2C_DEFAULT)) {
471471
dai_index = i;
472472
break;

0 commit comments

Comments
 (0)