On Tue, Aug 11, 2015 at 11:47:25PM +0200, Linus Lüssing wrote: > On Tue, Aug 11, 2015 at 10:51:40PM +0200, Linus Lüssing wrote: > > On Mon, Aug 10, 2015 at 02:56:12PM -0700, Brenden Blanco wrote: > > > Doing some code reading with Alexei, we found a suspect commit, which > > > introduces an skb_get and skb_may_pull of the same skb, which leads to > > > the BUG > > > when skb->len == len. > > > > Urgh, didn't know that pskb_may_pull() doesn't like an skb with a > > reference count greater than one... But yes, the BUG() call in > > skbuff.c:1128 / pskb_expand_head() says that (though in this case > > the BUG() in skbuff.c call actually seems kinda weird (/"wrong"?), as > > it isn't shared between different code paths). > > The more I think about it, I'm tending to remove the BUG() call in > pskb_expand_head() as in this case it obviously isn't a bug. > > The skb_get() allows a simple and in my opinion easy to read cleanup > part of skb_trimmed for any caller of ip{v6,}_mc_check_mld(). No need > to check whether skb == skb_trimmed for a caller for instance, > simply checking whether skb_trimmed exists is enough. > > > Any objections to remove the "if (skb_shared(skb)) BUG()" part in > pskb_expand_head()? Or would there be any other undesired side > effects in utilising skb_get() like that?
That fundamental check was there for 10+ years and cannot be removed. bridge already did skb_share_check() before reaching this __ipv6_mc_check_mld() path. There is no reason to do skb_get() there. It wasn't there before commit 9afd85c9e4552 which claims to do: 'Some small refactoring was done to enhance readibility', but doing skb_get()+pskb_may_pull() which is incorrect. Avoiding unnecessary skb_clone() is a good thing, but it should be done without messing with skb->users, since this code path already owns skb. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html