• Nick Desaulniers's avatar
    net: seg6: initialize induction variable to first valid array index · ac0dbed9
    Nick Desaulniers authored
    Fixes the following warnings observed when building
    CONFIG_IPV6_SEG6_LWTUNNEL=y with clang:
    
      net/ipv6/seg6_local.o: warning: objtool: seg6_local_fill_encap() falls
      through to next function seg6_local_get_encap_size()
      net/ipv6/seg6_local.o: warning: objtool: seg6_local_cmp_encap() falls
      through to next function input_action_end()
    
    LLVM can fully unroll loops in seg6_local_get_encap_size() and
    seg6_local_cmp_encap(). One issue in those loops is that the induction
    variable is initialized to 0. The loop iterates over members of
    seg6_action_params, a global array of struct seg6_action_param calling
    their put() function pointer members.  seg6_action_param uses an array
    initializer to initialize SEG6_LOCAL_SRH and later elements, which is
    the third enumeration of an anonymous union.
    
    The guard `if (attrs & SEG6_F_ATTR(i))` may prevent this from being
    called at runtime, but it would still be UB for
    `seg6_action_params[0]->put` to be called; the unrolled loop will make
    the initial iterations unreachable, which LLVM will later rotate to
    fallthrough to the next function.
    
    Make this more obvious that this cannot happen to the compiler by
    initializing the loop induction variable to the minimum valid index that
    seg6_action_params is initialized to.
    Reported-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarNick Desaulniers <ndesaulniers@google.com>
    Link: https://lore.kernel.org/r/20220802161203.622293-1-ndesaulniers@google.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    ac0dbed9
seg6_local.c 46.1 KB