summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHagar Hemdan <hagarhem@amazon.com>2024-06-04 08:58:38 +0000
committerLinus Walleij <linus.walleij@linaro.org>2024-06-17 09:54:50 +0200
commitadec57ff8e66aee632f3dd1f93787c13d112b7a1 (patch)
tree14b673e49edc3206d7622801024d3c3cf3f26a13
parent61fef29ad120d3077aeb0ef598d76822acb8c4cb (diff)
downloadlinux-stable-adec57ff8e66aee632f3dd1f93787c13d112b7a1.tar.gz
linux-stable-adec57ff8e66aee632f3dd1f93787c13d112b7a1.tar.bz2
linux-stable-adec57ff8e66aee632f3dd1f93787c13d112b7a1.zip
pinctrl: fix deadlock in create_pinctrl() when handling -EPROBE_DEFER
In create_pinctrl(), pinctrl_maps_mutex is acquired before calling add_setting(). If add_setting() returns -EPROBE_DEFER, create_pinctrl() calls pinctrl_free(). However, pinctrl_free() attempts to acquire pinctrl_maps_mutex, which is already held by create_pinctrl(), leading to a potential deadlock. This patch resolves the issue by releasing pinctrl_maps_mutex before calling pinctrl_free(), preventing the deadlock. This bug was discovered and resolved using Coverity Static Analysis Security Testing (SAST) by Synopsys, Inc. Fixes: 42fed7ba44e4 ("pinctrl: move subsystem mutex to pinctrl_dev struct") Suggested-by: Maximilian Heyne <mheyne@amazon.de> Signed-off-by: Hagar Hemdan <hagarhem@amazon.com> Link: https://lore.kernel.org/r/20240604085838.3344-1-hagarhem@amazon.com Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
-rw-r--r--drivers/pinctrl/core.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c
index cffeb869130d..f424a57f0013 100644
--- a/drivers/pinctrl/core.c
+++ b/drivers/pinctrl/core.c
@@ -1106,8 +1106,8 @@ static struct pinctrl *create_pinctrl(struct device *dev,
* an -EPROBE_DEFER later, as that is the worst case.
*/
if (ret == -EPROBE_DEFER) {
- pinctrl_free(p, false);
mutex_unlock(&pinctrl_maps_mutex);
+ pinctrl_free(p, false);
return ERR_PTR(ret);
}
}