On Tue, Sep 16, 2014 at 08:53:06PM +0100, Martin Townsend wrote: ... > >I make another c example, hopeful more correct than the last one: > > > >char *foo(char *skb) > >{ > > char *new; > > > > if (some_error_before_consume) > > return ERR_PTR(-EINVAL); /* here we need to do a free(skb) */ > > > > /* UDP expand */ > > new = expand(skb, 16); s/16/8 , argl, doesn't matter was only an example. :-) > > if (!new) > > return ERR_PTR(-ENOMEM); > > consume(skb); /* parameter skb becomes dangling pointer */ > > skb = new; /* doesn't rescue it, it is different than skb from caller function > > at this point, the skb_inout had rescue it, because it was a pointer > > of pointer */ > > > > /* IPv6 expand */ > > new = expand(skb, 40); > > if (!new) /* some error after a consume(skb), will crash at drop_skb label */ > > return ERR_PTR(-ENOMEM); > > consume(skb); > > skb = new; > > > > return skb; > >} > I see the problem now, once the skb has been copied and then an error occurs > you have to return the error and the skb has been lost. Would using the > skb->cb to store decompress status get around this problem? mhhh, complicated... on 802.15.4 6LoWPAN we use the control block information for fragmentation information. I don't know right now if we get trouble when we add the "uncompression on the fly when FRAG1 was received". What exactly do you mean with "decompress status"? - Alex -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html