2024-01-10 21:56:12

by Kees Cook

[permalink] [raw]
Subject: [PATCH] ARM: unwind: Add missing "Call trace:" line

Every other architecture in Linux includes the line "Call trace:" before
backtraces. In some cases ARM would print "Backtrace:", but this was
only via 1 specific call path, and wasn't included in CPU Oops nor things
like KASAN, UBSAN, etc that called dump_stack(). Regularize this line
so CI systems and other things (like LKDTM) that depend on parsing
"Call trace:" out of dmesg will see it for ARM.

Before this patch:

UBSAN: array-index-out-of-bounds in ../drivers/misc/lkdtm/bugs.c:376:16
index 8 is out of range for type 'char [8]'
CPU: 0 PID: 1402 Comm: cat Not tainted 6.7.0-rc2 #1
Hardware name: Generic DT based system
dump_backtrace from show_stack+0x20/0x24
r7:00000042 r6:00000000 r5:60070013 r4:80cf5d7c
show_stack from dump_stack_lvl+0x88/0x98
dump_stack_lvl from dump_stack+0x18/0x1c
r7:00000042 r6:00000008 r5:00000008 r4:80fab118
dump_stack from ubsan_epilogue+0x10/0x3c
ubsan_epilogue from __ubsan_handle_out_of_bounds+0x80/0x84
...

After this patch:

UBSAN: array-index-out-of-bounds in ../drivers/misc/lkdtm/bugs.c:376:16
index 8 is out of range for type 'char [8]'
CPU: 0 PID: 1402 Comm: cat Not tainted 6.7.0-rc2 #1
Hardware name: Generic DT based system
Call trace:
dump_backtrace from show_stack+0x20/0x24
r7:00000042 r6:00000000 r5:60070013 r4:80cf5d7c
show_stack from dump_stack_lvl+0x88/0x98
dump_stack_lvl from dump_stack+0x18/0x1c
r7:00000042 r6:00000008 r5:00000008 r4:80fab118
dump_stack from ubsan_epilogue+0x10/0x3c
ubsan_epilogue from __ubsan_handle_out_of_bounds+0x80/0x84
...

Reported-by: Mark Brown <[email protected]>
Cc: Russell King <[email protected]>
Cc: Ard Biesheuvel <[email protected]>
Cc: Arnd Bergmann <[email protected]>
Cc: Linus Walleij <[email protected]>
Cc: Vladimir Murzin <[email protected]>
Cc: Zhen Lei <[email protected]>
Cc: Keith Packard <[email protected]>
Cc: Haibo Li <[email protected]>
Cc: [email protected]
Signed-off-by: Kees Cook <[email protected]>
---
arch/arm/kernel/traps.c | 2 +-
arch/arm/kernel/unwind.c | 2 ++
2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c
index 3bad79db5d6e..72c82a4d63ac 100644
--- a/arch/arm/kernel/traps.c
+++ b/arch/arm/kernel/traps.c
@@ -220,7 +220,7 @@ void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk,
unsigned int fp, mode;
int ok = 1;

- printk("%sBacktrace: ", loglvl);
+ printk("%sCall trace: ", loglvl);

if (!tsk)
tsk = current;
diff --git a/arch/arm/kernel/unwind.c b/arch/arm/kernel/unwind.c
index 9d2192156087..f60547dadc93 100644
--- a/arch/arm/kernel/unwind.c
+++ b/arch/arm/kernel/unwind.c
@@ -524,6 +524,8 @@ void unwind_backtrace(struct pt_regs *regs, struct task_struct *tsk,
{
struct stackframe frame;

+ printk("%sCall trace: ", loglvl);
+
pr_debug("%s(regs = %p tsk = %p)\n", __func__, regs, tsk);

if (!tsk)
--
2.34.1



2024-01-10 23:46:48

by Linus Walleij

[permalink] [raw]
Subject: Re: [PATCH] ARM: unwind: Add missing "Call trace:" line

On Wed, Jan 10, 2024 at 10:56 PM Kees Cook <[email protected]> wrote:

> Every other architecture in Linux includes the line "Call trace:" before
> backtraces. In some cases ARM would print "Backtrace:", but this was
> only via 1 specific call path, and wasn't included in CPU Oops nor things
> like KASAN, UBSAN, etc that called dump_stack(). Regularize this line
> so CI systems and other things (like LKDTM) that depend on parsing
> "Call trace:" out of dmesg will see it for ARM.
>
> Before this patch:
>
> UBSAN: array-index-out-of-bounds in ../drivers/misc/lkdtm/bugs.c:376:16
> index 8 is out of range for type 'char [8]'
> CPU: 0 PID: 1402 Comm: cat Not tainted 6.7.0-rc2 #1
> Hardware name: Generic DT based system
> dump_backtrace from show_stack+0x20/0x24
> r7:00000042 r6:00000000 r5:60070013 r4:80cf5d7c
> show_stack from dump_stack_lvl+0x88/0x98
> dump_stack_lvl from dump_stack+0x18/0x1c
> r7:00000042 r6:00000008 r5:00000008 r4:80fab118
> dump_stack from ubsan_epilogue+0x10/0x3c
> ubsan_epilogue from __ubsan_handle_out_of_bounds+0x80/0x84
> ...
>
> After this patch:
>
> UBSAN: array-index-out-of-bounds in ../drivers/misc/lkdtm/bugs.c:376:16
> index 8 is out of range for type 'char [8]'
> CPU: 0 PID: 1402 Comm: cat Not tainted 6.7.0-rc2 #1
> Hardware name: Generic DT based system
> Call trace:
> dump_backtrace from show_stack+0x20/0x24
> r7:00000042 r6:00000000 r5:60070013 r4:80cf5d7c
> show_stack from dump_stack_lvl+0x88/0x98
> dump_stack_lvl from dump_stack+0x18/0x1c
> r7:00000042 r6:00000008 r5:00000008 r4:80fab118
> dump_stack from ubsan_epilogue+0x10/0x3c
> ubsan_epilogue from __ubsan_handle_out_of_bounds+0x80/0x84
> ...
>
> Reported-by: Mark Brown <[email protected]>
> Cc: Russell King <[email protected]>
> Cc: Ard Biesheuvel <[email protected]>
> Cc: Arnd Bergmann <[email protected]>
> Cc: Linus Walleij <[email protected]>
> Cc: Vladimir Murzin <[email protected]>
> Cc: Zhen Lei <[email protected]>
> Cc: Keith Packard <[email protected]>
> Cc: Haibo Li <[email protected]>
> Cc: [email protected]
> Signed-off-by: Kees Cook <[email protected]>

Makes sense.
Reviewed-by: Linus Walleij <[email protected]>

Yours,
Linus Walleij

Subject: Re: [PATCH] ARM: unwind: Add missing "Call trace:" line

Il 10/01/24 22:56, Kees Cook ha scritto:
> Every other architecture in Linux includes the line "Call trace:" before
> backtraces. In some cases ARM would print "Backtrace:", but this was
> only via 1 specific call path, and wasn't included in CPU Oops nor things
> like KASAN, UBSAN, etc that called dump_stack(). Regularize this line
> so CI systems and other things (like LKDTM) that depend on parsing
> "Call trace:" out of dmesg will see it for ARM.
>
> Before this patch:
>
> UBSAN: array-index-out-of-bounds in ../drivers/misc/lkdtm/bugs.c:376:16
> index 8 is out of range for type 'char [8]'
> CPU: 0 PID: 1402 Comm: cat Not tainted 6.7.0-rc2 #1
> Hardware name: Generic DT based system
> dump_backtrace from show_stack+0x20/0x24
> r7:00000042 r6:00000000 r5:60070013 r4:80cf5d7c
> show_stack from dump_stack_lvl+0x88/0x98
> dump_stack_lvl from dump_stack+0x18/0x1c
> r7:00000042 r6:00000008 r5:00000008 r4:80fab118
> dump_stack from ubsan_epilogue+0x10/0x3c
> ubsan_epilogue from __ubsan_handle_out_of_bounds+0x80/0x84
> ...
>
> After this patch:
>
> UBSAN: array-index-out-of-bounds in ../drivers/misc/lkdtm/bugs.c:376:16
> index 8 is out of range for type 'char [8]'
> CPU: 0 PID: 1402 Comm: cat Not tainted 6.7.0-rc2 #1
> Hardware name: Generic DT based system
> Call trace:
> dump_backtrace from show_stack+0x20/0x24
> r7:00000042 r6:00000000 r5:60070013 r4:80cf5d7c
> show_stack from dump_stack_lvl+0x88/0x98
> dump_stack_lvl from dump_stack+0x18/0x1c
> r7:00000042 r6:00000008 r5:00000008 r4:80fab118
> dump_stack from ubsan_epilogue+0x10/0x3c
> ubsan_epilogue from __ubsan_handle_out_of_bounds+0x80/0x84
> ...
>
> Reported-by: Mark Brown <[email protected]>
> Cc: Russell King <[email protected]>
> Cc: Ard Biesheuvel <[email protected]>
> Cc: Arnd Bergmann <[email protected]>
> Cc: Linus Walleij <[email protected]>
> Cc: Vladimir Murzin <[email protected]>
> Cc: Zhen Lei <[email protected]>
> Cc: Keith Packard <[email protected]>
> Cc: Haibo Li <[email protected]>
> Cc: [email protected]
> Signed-off-by: Kees Cook <[email protected]>

Reviewed-by: AngeloGioacchino Del Regno <[email protected]>


2024-01-11 15:50:04

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH] ARM: unwind: Add missing "Call trace:" line

On Wed, Jan 10, 2024 at 01:56:01PM -0800, Kees Cook wrote:
> Every other architecture in Linux includes the line "Call trace:" before
> backtraces. In some cases ARM would print "Backtrace:", but this was
> only via 1 specific call path, and wasn't included in CPU Oops nor things
> like KASAN, UBSAN, etc that called dump_stack(). Regularize this line
> so CI systems and other things (like LKDTM) that depend on parsing
> "Call trace:" out of dmesg will see it for ARM.

Reviewed-by: Mark Brown <[email protected]>


Attachments:
(No filename) (527.00 B)
signature.asc (499.00 B)
Download all attachments