net: fix wrong skb_get() usage / crash in IGMP/MLD parsing code
authorLinus Lüssing <linus.luessing@c0d3.blue>
Thu, 13 Aug 2015 03:54:07 +0000 (05:54 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 14 Aug 2015 00:08:39 +0000 (17:08 -0700)
commita516993f0ac1694673412eb2d16a091eafa77d2a
tree43e65ff360cc79cff96dc8c44f161fb0ad41b9c9
parent5b3e2e14eaa2a98232a4f292341fb88438685734
net: fix wrong skb_get() usage / crash in IGMP/MLD parsing code

The recent refactoring of the IGMP and MLD parsing code into
ipv6_mc_check_mld() / ip_mc_check_igmp() introduced a potential crash /
BUG() invocation for bridges:

I wrongly assumed that skb_get() could be used as a simple reference
counter for an skb which is not the case. skb_get() bears additional
semantics, a user count. This leads to a BUG() invocation in
pskb_expand_head() / kernel panic if pskb_may_pull() is called on an skb
with a user count greater than one - unfortunately the refactoring did
just that.

Fixing this by removing the skb_get() call and changing the API: The
caller of ipv6_mc_check_mld() / ip_mc_check_igmp() now needs to
additionally check whether the returned skb_trimmed is a clone.

Fixes: 9afd85c9e455 ("net: Export IGMP/MLD message validation code")
Reported-by: Brenden Blanco <bblanco@plumgrid.com>
Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
Acked-by: Alexei Starovoitov <ast@plumgrid.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/bridge/br_multicast.c
net/core/skbuff.c
net/ipv4/igmp.c
net/ipv6/mcast_snoop.c