• Arnd Bergmann's avatar
    netfilter: ip_vs_sync: fix bogus maybe-uninitialized warning · 57476202
    Arnd Bergmann authored
    Building the ip_vs_sync code with CONFIG_OPTIMIZE_INLINING on x86
    confuses the compiler to the point where it produces a rather
    dubious warning message:
    
    net/netfilter/ipvs/ip_vs_sync.c:1073:33: error: ‘opt.init_seq’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
      struct ip_vs_sync_conn_options opt;
                                     ^~~
    net/netfilter/ipvs/ip_vs_sync.c:1073:33: error: ‘opt.delta’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
    net/netfilter/ipvs/ip_vs_sync.c:1073:33: error: ‘opt.previous_delta’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
    net/netfilter/ipvs/ip_vs_sync.c:1073:33: error: ‘*((void *)&opt+12).init_seq’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
    net/netfilter/ipvs/ip_vs_sync.c:1073:33: error: ‘*((void *)&opt+12).delta’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
    net/netfilter/ipvs/ip_vs_sync.c:1073:33: error: ‘*((void *)&opt+12).previous_delta’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
    
    The problem appears to be a combination of a number of factors, including
    the __builtin_bswap32 compiler builtin being slightly odd, having a large
    amount of code inlined into a single function, and the way that some
    functions only get partially inlined here.
    
    I've spent way too much time trying to work out a way to improve the
    code, but the best I've come up with is to add an explicit memset
    right before the ip_vs_seq structure is first initialized here. When
    the compiler works correctly, this has absolutely no effect, but in the
    case that produces the warning, the warning disappears.
    
    In the process of analysing this warning, I also noticed that
    we use memcpy to copy the larger ip_vs_sync_conn_options structure
    over two members of the ip_vs_conn structure. This works because
    the layout is identical, but seems error-prone, so I'm changing
    this in the process to directly copy the two members. This change
    seemed to have no effect on the object code or the warning, but
    it deals with the same data, so I kept the two changes together.
    Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
    Acked-by: default avatarJulian Anastasov <ja@ssi.bg>
    Signed-off-by: default avatarSimon Horman <horms@verge.net.au>
    Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
    57476202
ip_vs_sync.c 53.6 KB