Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

ASoC: Intel: Fix invalid quirk input mapping

Merge series from Takashi Iwai <tiwai@suse.de>:

This is a revised patch set for potential OOB accesses when wild
values are passed to quirk option for ASoC Intel drivers.
Unlike the v1 previous patchset, invalid quirk values are checked and
corrected at log_quirks() in each driver, instead.

v1: https://lore.kernel.org/20250415083144.6588-1-tiwai@suse.de

Takashi

===

Takashi Iwai (3):
ASoC: Intel: bytcht_es8316: Fix invalid quirk input mapping
ASoC: Intel: bytcr_rt5640: Fix invalid quirk input mapping
ASoC: Intel: bytcr_rt5651: Fix invalid quirk input mapping

sound/soc/intel/boards/bytcht_es8316.c | 20 +++++++++++++++++---
sound/soc/intel/boards/bytcr_rt5640.c | 7 +++++--
sound/soc/intel/boards/bytcr_rt5651.c | 26 +++++++++++++++++++++-----
3 files changed, 43 insertions(+), 10 deletions(-)

--
2.50.1

+43 -10
+17 -3
sound/soc/intel/boards/bytcht_es8316.c
··· 47 47 BYT_CHT_ES8316_INTMIC_IN2_MAP, 48 48 }; 49 49 50 - #define BYT_CHT_ES8316_MAP(quirk) ((quirk) & GENMASK(3, 0)) 50 + #define BYT_CHT_ES8316_MAP_MASK GENMASK(3, 0) 51 + #define BYT_CHT_ES8316_MAP(quirk) ((quirk) & BYT_CHT_ES8316_MAP_MASK) 51 52 #define BYT_CHT_ES8316_SSP0 BIT(16) 52 53 #define BYT_CHT_ES8316_MONO_SPEAKER BIT(17) 53 54 #define BYT_CHT_ES8316_JD_INVERTED BIT(18) ··· 61 60 62 61 static void log_quirks(struct device *dev) 63 62 { 64 - if (BYT_CHT_ES8316_MAP(quirk) == BYT_CHT_ES8316_INTMIC_IN1_MAP) 63 + int map; 64 + 65 + map = BYT_CHT_ES8316_MAP(quirk); 66 + switch (map) { 67 + case BYT_CHT_ES8316_INTMIC_IN1_MAP: 65 68 dev_info(dev, "quirk IN1_MAP enabled"); 66 - if (BYT_CHT_ES8316_MAP(quirk) == BYT_CHT_ES8316_INTMIC_IN2_MAP) 69 + break; 70 + case BYT_CHT_ES8316_INTMIC_IN2_MAP: 67 71 dev_info(dev, "quirk IN2_MAP enabled"); 72 + break; 73 + default: 74 + dev_warn_once(dev, "quirk sets invalid input map: 0x%x, default to INTMIC_IN1_MAP\n", map); 75 + quirk &= ~BYT_CHT_ES8316_MAP_MASK; 76 + quirk |= BYT_CHT_ES8316_INTMIC_IN1_MAP; 77 + break; 78 + } 79 + 68 80 if (quirk & BYT_CHT_ES8316_SSP0) 69 81 dev_info(dev, "quirk SSP0 enabled"); 70 82 if (quirk & BYT_CHT_ES8316_MONO_SPEAKER)
+5 -2
sound/soc/intel/boards/bytcr_rt5640.c
··· 68 68 BYT_RT5640_OVCD_SF_1P5 = (RT5640_OVCD_SF_1P5 << 13), 69 69 }; 70 70 71 - #define BYT_RT5640_MAP(quirk) ((quirk) & GENMASK(3, 0)) 71 + #define BYT_RT5640_MAP_MASK GENMASK(3, 0) 72 + #define BYT_RT5640_MAP(quirk) ((quirk) & BYT_RT5640_MAP_MASK) 72 73 #define BYT_RT5640_JDSRC(quirk) (((quirk) & GENMASK(7, 4)) >> 4) 73 74 #define BYT_RT5640_OVCD_TH(quirk) (((quirk) & GENMASK(12, 8)) >> 8) 74 75 #define BYT_RT5640_OVCD_SF(quirk) (((quirk) & GENMASK(14, 13)) >> 13) ··· 141 140 dev_info(dev, "quirk NO_INTERNAL_MIC_MAP enabled\n"); 142 141 break; 143 142 default: 144 - dev_err(dev, "quirk map 0x%x is not supported, microphone input will not work\n", map); 143 + dev_warn_once(dev, "quirk sets invalid input map: 0x%x, default to DMIC1_MAP\n", map); 144 + byt_rt5640_quirk &= ~BYT_RT5640_MAP_MASK; 145 + byt_rt5640_quirk |= BYT_RT5640_DMIC1_MAP; 145 146 break; 146 147 } 147 148 if (byt_rt5640_quirk & BYT_RT5640_HSMIC2_ON_IN1)
+21 -5
sound/soc/intel/boards/bytcr_rt5651.c
··· 58 58 BYT_RT5651_OVCD_SF_1P5 = (RT5651_OVCD_SF_1P5 << 13), 59 59 }; 60 60 61 - #define BYT_RT5651_MAP(quirk) ((quirk) & GENMASK(3, 0)) 61 + #define BYT_RT5651_MAP_MASK GENMASK(3, 0) 62 + #define BYT_RT5651_MAP(quirk) ((quirk) & BYT_RT5651_MAP_MASK) 62 63 #define BYT_RT5651_JDSRC(quirk) (((quirk) & GENMASK(7, 4)) >> 4) 63 64 #define BYT_RT5651_OVCD_TH(quirk) (((quirk) & GENMASK(12, 8)) >> 8) 64 65 #define BYT_RT5651_OVCD_SF(quirk) (((quirk) & GENMASK(14, 13)) >> 13) ··· 101 100 102 101 static void log_quirks(struct device *dev) 103 102 { 104 - if (BYT_RT5651_MAP(byt_rt5651_quirk) == BYT_RT5651_DMIC_MAP) 103 + int map; 104 + 105 + map = BYT_RT5651_MAP(byt_rt5651_quirk); 106 + switch (map) { 107 + case BYT_RT5651_DMIC_MAP: 105 108 dev_info(dev, "quirk DMIC_MAP enabled"); 106 - if (BYT_RT5651_MAP(byt_rt5651_quirk) == BYT_RT5651_IN1_MAP) 109 + break; 110 + case BYT_RT5651_IN1_MAP: 107 111 dev_info(dev, "quirk IN1_MAP enabled"); 108 - if (BYT_RT5651_MAP(byt_rt5651_quirk) == BYT_RT5651_IN2_MAP) 112 + break; 113 + case BYT_RT5651_IN2_MAP: 109 114 dev_info(dev, "quirk IN2_MAP enabled"); 110 - if (BYT_RT5651_MAP(byt_rt5651_quirk) == BYT_RT5651_IN1_IN2_MAP) 115 + break; 116 + case BYT_RT5651_IN1_IN2_MAP: 111 117 dev_info(dev, "quirk IN1_IN2_MAP enabled"); 118 + break; 119 + default: 120 + dev_warn_once(dev, "quirk sets invalid input map: 0x%x, default to DMIC_MAP\n", map); 121 + byt_rt5651_quirk &= ~BYT_RT5651_MAP_MASK; 122 + byt_rt5651_quirk |= BYT_RT5651_DMIC_MAP; 123 + break; 124 + } 125 + 112 126 if (BYT_RT5651_JDSRC(byt_rt5651_quirk)) { 113 127 dev_info(dev, "quirk realtek,jack-detect-source %ld\n", 114 128 BYT_RT5651_JDSRC(byt_rt5651_quirk));