| From 9c9b73598084e5c9c21821d96374e59ae217b373 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 24 Mar 2025 14:56:09 -0700 |
| Subject: objtool, ASoC: codecs: wcd934x: Remove potential undefined behavior |
| in wcd934x_slim_irq_handler() |
| |
| From: Josh Poimboeuf <jpoimboe@kernel.org> |
| |
| [ Upstream commit 060aed9c0093b341480770457093449771cf1496 ] |
| |
| If 'port_id' is negative, the shift counts in wcd934x_slim_irq_handler() |
| also become negative, resulting in undefined behavior due to shift out |
| of bounds. |
| |
| If I'm reading the code correctly, that appears to be not possible, but |
| with KCOV enabled, Clang's range analysis isn't always able to determine |
| that and generates undefined behavior. |
| |
| As a result the code generation isn't optimal, and undefined behavior |
| should be avoided regardless. Improve code generation and remove the |
| undefined behavior by converting the signed variables to unsigned. |
| |
| Fixes the following warning with UBSAN: |
| |
| sound/soc/codecs/snd-soc-wcd934x.o: warning: objtool: .text.wcd934x_slim_irq_handler: unexpected end of section |
| |
| Reported-by: kernel test robot <lkp@intel.com> |
| Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org> |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| Acked-by: Mark Brown <broonie@kernel.org> |
| Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> |
| Cc: Liam Girdwood <lgirdwood@gmail.com> |
| Cc: Jaroslav Kysela <perex@perex.cz> |
| Cc: Takashi Iwai <tiwai@suse.com> |
| Cc: Linus Torvalds <torvalds@linux-foundation.org> |
| Link: https://lore.kernel.org/r/7e863839ec7301bf9c0f429a03873d44e484c31c.1742852847.git.jpoimboe@kernel.org |
| Closes: https://lore.kernel.org/oe-kbuild-all/202503180044.oH9gyPeg-lkp@intel.com/ |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| sound/soc/codecs/wcd934x.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/sound/soc/codecs/wcd934x.c b/sound/soc/codecs/wcd934x.c |
| index 910852eb9698c..c7f1b28f3b230 100644 |
| --- a/sound/soc/codecs/wcd934x.c |
| +++ b/sound/soc/codecs/wcd934x.c |
| @@ -2273,7 +2273,7 @@ static irqreturn_t wcd934x_slim_irq_handler(int irq, void *data) |
| { |
| struct wcd934x_codec *wcd = data; |
| unsigned long status = 0; |
| - int i, j, port_id; |
| + unsigned int i, j, port_id; |
| unsigned int val, int_val = 0; |
| irqreturn_t ret = IRQ_NONE; |
| bool tx; |
| -- |
| 2.39.5 |
| |