From: Steven Rostedt <[email protected]>

As kaslr_offset() is architecture dependent and also may not be defined by
all architectures, when zeroing out unused weak functions, do not check
against kaslr_offset(), but instead check if the address is within the
kernel text sections. If KASLR added a shift to the zeroed out function,
it would still not be located in the kernel text. This is a more robust
way to test if the text is valid or not.

Fixes: ef378c3b8233 ("scripts/sorttable: Zero out weak functions in mcount_loc 
table")
Reported-by: Nathan Chancellor <[email protected]>
Reported-by: Mark Brown <[email protected]>
Tested-by: Nathan Chancellor <[email protected]>
Closes: https://lore.kernel.org/all/20250224180805.GA1536711@ax162/
Closes: 
https://lore.kernel.org/all/[email protected]/
Signed-off-by: Steven Rostedt (Google) <[email protected]>
---
 kernel/trace/ftrace.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 183f72cf15ed..bec7b5dbdb3b 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -7004,7 +7004,6 @@ static int ftrace_process_locs(struct module *mod,
        unsigned long count;
        unsigned long *p;
        unsigned long addr;
-       unsigned long kaslr;
        unsigned long flags = 0; /* Shut up gcc */
        unsigned long pages;
        int ret = -ENOMEM;
@@ -7056,9 +7055,6 @@ static int ftrace_process_locs(struct module *mod,
                ftrace_pages->next = start_pg;
        }
 
-       /* For zeroed locations that were shifted for core kernel */
-       kaslr = !mod ? kaslr_offset() : 0;
-
        p = start;
        pg = start_pg;
        while (p < end) {
@@ -7072,7 +7068,18 @@ static int ftrace_process_locs(struct module *mod,
                 * object files to satisfy alignments.
                 * Skip any NULL pointers.
                 */
-               if (!addr || addr == kaslr) {
+               if (!addr) {
+                       skipped++;
+                       continue;
+               }
+
+               /*
+                * If this is core kernel, make sure the address is in core
+                * or inittext, as weak functions get zeroed and KASLR can
+                * move them to something other than zero. It just will not
+                * move it to an area where kernel text is.
+                */
+               if (!mod && !(is_kernel_text(addr) || 
is_kernel_inittext(addr))) {
                        skipped++;
                        continue;
                }
-- 
2.47.2



Reply via email to