]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
scs: fix a wrong parameter in __scs_magic
authorZhichi Lin <zhichi.lin@vivo.com>
Sat, 11 Oct 2025 08:22:22 +0000 (16:22 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Wed, 12 Nov 2025 18:00:13 +0000 (10:00 -0800)
__scs_magic() needs a 'void *' variable, but a 'struct task_struct *' is
given.  'task_scs(tsk)' is the starting address of the task's shadow call
stack, and '__scs_magic(task_scs(tsk))' is the end address of the task's
shadow call stack.  Here should be '__scs_magic(task_scs(tsk))'.

The user-visible effect of this bug is that when CONFIG_DEBUG_STACK_USAGE
is enabled, the shadow call stack usage checking function
(scs_check_usage) would scan an incorrect memory range.  This could lead
to:

1. **Inaccurate stack usage reporting**: The function would calculate
   wrong usage statistics for the shadow call stack, potentially showing
   incorrect value in kmsg.

2. **Potential kernel crash**: If the value of __scs_magic(tsk)is
   greater than that of __scs_magic(task_scs(tsk)), the for loop may
   access unmapped memory, potentially causing a kernel panic.  However,
   this scenario is unlikely because task_struct is allocated via the slab
   allocator (which typically returns lower addresses), while the shadow
   call stack returned by task_scs(tsk) is allocated via vmalloc(which
   typically returns higher addresses).

However, since this is purely a debugging feature
(CONFIG_DEBUG_STACK_USAGE), normal production systems should be not
unaffected.  The bug only impacts developers and testers who are actively
debugging stack usage with this configuration enabled.

Link: https://lkml.kernel.org/r/20251011082222.12965-1-zhichi.lin@vivo.com
Fixes: 5bbaf9d1fcb9 ("scs: Add support for stack usage debugging")
Signed-off-by: Jiyuan Xie <xiejiyuan@vivo.com>
Signed-off-by: Zhichi Lin <zhichi.lin@vivo.com>
Reviewed-by: Sami Tolvanen <samitolvanen@google.com>
Acked-by: Will Deacon <will@kernel.org>
Cc: Andrey Konovalov <andreyknvl@gmail.com>
Cc: Kees Cook <keescook@chromium.org>
Cc: Marco Elver <elver@google.com>
Cc: Will Deacon <will@kernel.org>
Cc: Yee Lee <yee.lee@mediatek.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
kernel/scs.c

index d7809affe740471eac9a9723f7df7e92353aa0a7..772488afd5b97284011c881d41add10bee821e33 100644 (file)
@@ -135,7 +135,7 @@ static void scs_check_usage(struct task_struct *tsk)
        if (!IS_ENABLED(CONFIG_DEBUG_STACK_USAGE))
                return;
 
-       for (p = task_scs(tsk); p < __scs_magic(tsk); ++p) {
+       for (p = task_scs(tsk); p < __scs_magic(task_scs(tsk)); ++p) {
                if (!READ_ONCE_NOCHECK(*p))
                        break;
                used += sizeof(*p);