Skip to content

Commit

Permalink
udpv6: fix possible user after free in error handler
Browse files Browse the repository at this point in the history
Before derefencing the encap pointer, commit e7cc082 ("udp: Support
for error handlers of tunnels with arbitrary destination port") checks
for a NULL value, but the two fetch operation can race with removal.
Fix the above using a single access.
Also fix a couple of type annotations, to make sparse happy.

Fixes: e7cc082 ("udp: Support for error handlers of tunnels with arbitrary destination port")
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Acked-by: Stefano Brivio <sbrivio@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Paolo Abeni authored and David S. Miller committed Feb 23, 2019
1 parent 5de362d commit 424a7cd
Showing 1 changed file with 6 additions and 4 deletions.
10 changes: 6 additions & 4 deletions net/ipv6/udp.c
Original file line number Diff line number Diff line change
Expand Up @@ -420,17 +420,19 @@ EXPORT_SYMBOL(udpv6_encap_enable);
*/
static int __udp6_lib_err_encap_no_sk(struct sk_buff *skb,
struct inet6_skb_parm *opt,
u8 type, u8 code, int offset, u32 info)
u8 type, u8 code, int offset, __be32 info)
{
int i;

for (i = 0; i < MAX_IPTUN_ENCAP_OPS; i++) {
int (*handler)(struct sk_buff *skb, struct inet6_skb_parm *opt,
u8 type, u8 code, int offset, u32 info);
u8 type, u8 code, int offset, __be32 info);
const struct ip6_tnl_encap_ops *encap;

if (!ip6tun_encaps[i])
encap = rcu_dereference(ip6tun_encaps[i]);
if (!encap)
continue;
handler = rcu_dereference(ip6tun_encaps[i]->err_handler);
handler = encap->err_handler;
if (handler && !handler(skb, opt, type, code, offset, info))
return 0;
}
Expand Down

0 comments on commit 424a7cd

Please sign in to comment.