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 ------------------------------------------------------------------------------ Want excitement? Manually upgrade your production database. When you want reliability, choose Perforce. Perforce version control. Predictably reliable. http://pubads.g.doubleclick.net/gampad/clk?id=157508191&iu=/4140/ostg.clktrk _______________________________________________ Linux-zigbee-devel mailing list Linux-zigbee-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel