[PATCH v3 07/10] ARM: backtrace-clang: avoid crash on bogus frame pointer
Nick Desaulniers
ndesaulniers at google.com
Mon Oct 18 12:58:53 PDT 2021
On Sun, Oct 17, 2021 at 6:17 AM Ard Biesheuvel <ardb at kernel.org> wrote:
>
> The Clang backtrace code dereferences the link register value pulled
> from the stack to decide whether the caller was a branch-and-link
> instruction, in order to subsequently decode the offset to find the
> start of the calling function. Unlike other loads in this routine, this
> one is not protected by a fixup, and may therefore cause a crash if the
> address in question is bogus.
>
> So let's fix this, by treating the fault as a failure to decode the 'bl'
> instruction. To avoid a label renum, reuse a fixup label that guards an
> instruction that cannot fault to begin with.
Thanks for fixing this. My understanding of fixups was non-existent
when I initially reviewed this code. (Taking the time to write
http://nickdesaulniers.github.io/blog/2020/04/06/off-by-two/ helped a
lot).
Reviewed-by: Nick Desaulniers <ndesaulniers at google.com>
>
> Signed-off-by: Ard Biesheuvel <ardb at kernel.org>
> ---
> arch/arm/lib/backtrace-clang.S | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/arch/arm/lib/backtrace-clang.S b/arch/arm/lib/backtrace-clang.S
> index 5b2cdb1003e3..5b4bca85d06d 100644
> --- a/arch/arm/lib/backtrace-clang.S
> +++ b/arch/arm/lib/backtrace-clang.S
> @@ -144,7 +144,7 @@ for_each_frame: tst frame, mask @ Check for address exceptions
> */
> 1003: ldr sv_lr, [sv_fp, #4] @ get saved lr from next frame
>
> - ldr r0, [sv_lr, #-4] @ get call instruction
> +1004: ldr r0, [sv_lr, #-4] @ get call instruction
> ldr r3, .Lopcode+4
> and r2, r3, r0 @ is this a bl call
> teq r2, r3
> @@ -164,7 +164,7 @@ finished_setup:
> /*
> * Print the function (sv_pc) and where it was called from (sv_lr).
> */
> -1004: mov r0, sv_pc
> + mov r0, sv_pc
>
> mov r1, sv_lr
> mov r2, frame
> @@ -210,7 +210,7 @@ ENDPROC(c_backtrace)
> .long 1001b, 1006b
> .long 1002b, 1006b
> .long 1003b, 1006b
> - .long 1004b, 1006b
> + .long 1004b, finished_setup
> .long 1005b, 1006b
> .popsection
>
> --
> 2.30.2
>
--
Thanks,
~Nick Desaulniers
More information about the linux-arm-kernel
mailing list