lkml.org 
[lkml]   [2020]   [Mar]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[RFC][PATCH 01/16] objtool: Introduce validate_return()
    Trivial 'cleanup' to save one indentation level and match
    validate_call().

    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    ---
    tools/objtool/check.c | 64 ++++++++++++++++++++++++++++----------------------
    1 file changed, 36 insertions(+), 28 deletions(-)

    --- a/tools/objtool/check.c
    +++ b/tools/objtool/check.c
    @@ -1935,6 +1935,41 @@ static int validate_sibling_call(struct
    return validate_call(insn, state);
    }

    +static int validate_return(struct symbol *func, struct instruction *insn, struct insn_state *state)
    +{
    + if (state->uaccess && !func_uaccess_safe(func)) {
    + WARN_FUNC("return with UACCESS enabled",
    + insn->sec, insn->offset);
    + return 1;
    + }
    +
    + if (!state->uaccess && func_uaccess_safe(func)) {
    + WARN_FUNC("return with UACCESS disabled from a UACCESS-safe function",
    + insn->sec, insn->offset);
    + return 1;
    + }
    +
    + if (state->df) {
    + WARN_FUNC("return with DF set",
    + insn->sec, insn->offset);
    + return 1;
    + }
    +
    + if (func && has_modified_stack_frame(state)) {
    + WARN_FUNC("return with modified stack frame",
    + insn->sec, insn->offset);
    + return 1;
    + }
    +
    + if (state->bp_scratch) {
    + WARN("%s uses BP as a scratch register",
    + func->name);
    + return 1;
    + }
    +
    + return 0;
    +}
    +
    /*
    * Follow the branch starting at the given instruction, and recursively follow
    * any other branches (jumps). Meanwhile, track the frame pointer state at
    @@ -2050,34 +2085,7 @@ static int validate_branch(struct objtoo
    switch (insn->type) {

    case INSN_RETURN:
    - if (state.uaccess && !func_uaccess_safe(func)) {
    - WARN_FUNC("return with UACCESS enabled", sec, insn->offset);
    - return 1;
    - }
    -
    - if (!state.uaccess && func_uaccess_safe(func)) {
    - WARN_FUNC("return with UACCESS disabled from a UACCESS-safe function", sec, insn->offset);
    - return 1;
    - }
    -
    - if (state.df) {
    - WARN_FUNC("return with DF set", sec, insn->offset);
    - return 1;
    - }
    -
    - if (func && has_modified_stack_frame(&state)) {
    - WARN_FUNC("return with modified stack frame",
    - sec, insn->offset);
    - return 1;
    - }
    -
    - if (state.bp_scratch) {
    - WARN("%s uses BP as a scratch register",
    - func->name);
    - return 1;
    - }
    -
    - return 0;
    + return validate_return(func, insn, &state);

    case INSN_CALL:
    case INSN_CALL_DYNAMIC:

    \
     
     \ /
      Last update: 2020-03-12 14:53    [W:2.175 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site