lkml.org 
[lkml]   [2020]   [May]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 64/83] objtool: Fix CONFIG_UBSAN_TRAP unreachable warnings
    Date
    From: Josh Poimboeuf <jpoimboe@redhat.com>

    [ Upstream commit bd841d6154f5f41f8a32d3c1b0bc229e326e640a ]

    CONFIG_UBSAN_TRAP causes GCC to emit a UD2 whenever it encounters an
    unreachable code path. This includes __builtin_unreachable(). Because
    the BUG() macro uses __builtin_unreachable() after it emits its own UD2,
    this results in a double UD2. In this case objtool rightfully detects
    that the second UD2 is unreachable:

    init/main.o: warning: objtool: repair_env_string()+0x1c8: unreachable instruction

    We weren't able to figure out a way to get rid of the double UD2s, so
    just silence the warning.

    Reported-by: Randy Dunlap <rdunlap@infradead.org>
    Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Reviewed-by: Miroslav Benes <mbenes@suse.cz>
    Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/6653ad73c6b59c049211bd7c11ed3809c20ee9f5.1585761021.git.jpoimboe@redhat.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    tools/objtool/check.c | 17 +++++++++++++++--
    1 file changed, 15 insertions(+), 2 deletions(-)

    diff --git a/tools/objtool/check.c b/tools/objtool/check.c
    index 9fa4e1a46ca95..d6a971326f879 100644
    --- a/tools/objtool/check.c
    +++ b/tools/objtool/check.c
    @@ -2306,14 +2306,27 @@ static bool ignore_unreachable_insn(struct instruction *insn)
    !strcmp(insn->sec->name, ".altinstr_aux"))
    return true;

    + if (!insn->func)
    + return false;
    +
    + /*
    + * CONFIG_UBSAN_TRAP inserts a UD2 when it sees
    + * __builtin_unreachable(). The BUG() macro has an unreachable() after
    + * the UD2, which causes GCC's undefined trap logic to emit another UD2
    + * (or occasionally a JMP to UD2).
    + */
    + if (list_prev_entry(insn, list)->dead_end &&
    + (insn->type == INSN_BUG ||
    + (insn->type == INSN_JUMP_UNCONDITIONAL &&
    + insn->jump_dest && insn->jump_dest->type == INSN_BUG)))
    + return true;
    +
    /*
    * Check if this (or a subsequent) instruction is related to
    * CONFIG_UBSAN or CONFIG_KASAN.
    *
    * End the search at 5 instructions to avoid going into the weeds.
    */
    - if (!insn->func)
    - return false;
    for (i = 0; i < 5; i++) {

    if (is_kasan_insn(insn) || is_ubsan_insn(insn))
    --
    2.20.1


    \
     
     \ /
      Last update: 2020-05-01 15:40    [W:4.150 / U:0.204 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site