| From 3cdf8bb1d81d6bff327f3fa7ffed1a63f26d7f8c Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 20 May 2021 14:23:26 +0200 |
| Subject: module: correctly exit module_kallsyms_on_each_symbol when fn() != 0 |
| |
| From: Jon Mediero <jmdr@disroot.org> |
| |
| [ Upstream commit 2c0f0f3639562d6e38ee9705303c6457c4936eac ] |
| |
| Commit 013c1667cf78 ("kallsyms: refactor |
| {,module_}kallsyms_on_each_symbol") replaced the return inside the |
| nested loop with a break, changing the semantics of the function: the |
| break only exits the innermost loop, so the code continues iterating the |
| symbols of the next module instead of exiting. |
| |
| Fixes: 013c1667cf78 ("kallsyms: refactor {,module_}kallsyms_on_each_symbol") |
| Reviewed-by: Petr Mladek <pmladek@suse.com> |
| Reviewed-by: Miroslav Benes <mbenes@suse.cz> |
| Signed-off-by: Jon Mediero <jmdr@disroot.org> |
| Signed-off-by: Jessica Yu <jeyu@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| kernel/module.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| diff --git a/kernel/module.c b/kernel/module.c |
| index 260d6f3f6d68..f928037a1b56 100644 |
| --- a/kernel/module.c |
| +++ b/kernel/module.c |
| @@ -4410,9 +4410,10 @@ int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *, |
| ret = fn(data, kallsyms_symbol_name(kallsyms, i), |
| mod, kallsyms_symbol_value(sym)); |
| if (ret != 0) |
| - break; |
| + goto out; |
| } |
| } |
| +out: |
| mutex_unlock(&module_mutex); |
| return ret; |
| } |
| -- |
| 2.30.2 |
| |