Commit 3f20efba41916ee17ce82f0fdd02581ada2872b2
Committed by
Simon Horman
1 parent
017b1b6d28
ipvs: handle ip_vs_fill_iph_skb_off failure
ip_vs_fill_iph_skb_off() may not find an IP header, and gcc has determined that ip_vs_sip_fill_param() then incorrectly accesses the protocol fields: net/netfilter/ipvs/ip_vs_pe_sip.c: In function 'ip_vs_sip_fill_param': net/netfilter/ipvs/ip_vs_pe_sip.c:76:5: error: 'iph.protocol' may be used uninitialized in this function [-Werror=maybe-uninitialized] if (iph.protocol != IPPROTO_UDP) ^ net/netfilter/ipvs/ip_vs_pe_sip.c:81:10: error: 'iph.len' may be used uninitialized in this function [-Werror=maybe-uninitialized] dataoff = iph.len + sizeof(struct udphdr); ^ This adds a check for the ip_vs_fill_iph_skb_off() return code before looking at the ip header data returned from it. Signed-off-by: Arnd Bergmann <arnd@arndb.de> Fixes: b0e010c527de ("ipvs: replace ip_vs_fill_ip4hdr with ip_vs_fill_iph_skb_off") Acked-by: Julian Anastasov <ja@ssi.bg> Signed-off-by: Simon Horman <horms@verge.net.au>
Showing 1 changed file with 2 additions and 2 deletions Side-by-side Diff
net/netfilter/ipvs/ip_vs_pe_sip.c
... | ... | @@ -70,10 +70,10 @@ |
70 | 70 | const char *dptr; |
71 | 71 | int retc; |
72 | 72 | |
73 | - ip_vs_fill_iph_skb(p->af, skb, false, &iph); | |
73 | + retc = ip_vs_fill_iph_skb(p->af, skb, false, &iph); | |
74 | 74 | |
75 | 75 | /* Only useful with UDP */ |
76 | - if (iph.protocol != IPPROTO_UDP) | |
76 | + if (!retc || iph.protocol != IPPROTO_UDP) | |
77 | 77 | return -EINVAL; |
78 | 78 | /* todo: IPv6 fragments: |
79 | 79 | * I think this only should be done for the first fragment. /HS |