On Wed, Jan 21, 2015 at 01:22:47PM +0100, Martin Pieuchot wrote: > It is indeed confusing. I tried to check every cases but in the end I > think that it might be better to decouple the removal from the routing > table and the rtfree(). Updated diff below does that.
I think the code is not eqivalent. Note the &rt that is passed to rtrequest1() in rtdeletemsg(). That allowed rtrequest1() to change the route that got freed in the end. Old code in rtflushclone1() did this; call rtdeletemsg(rt) get info from rt call rtrequest1(info, &rt) call rnh_lookup(info) call rnh_deladdr(info) store new route into *rt, which is variable in rtdeletemsg() call rt_missmsg(info) call rtfree(rt), which is the new route New code in rtflushclone1 does this: call rtdeletemsg(rt) get info from rt call rtrequest1(info, &rt) call rnh_lookup(info) call rnh_deladdr(info) store new route into *rt, which is variable in rtdeletemsg() call rt_missmsg(info) call rtfree(rt), which is the original route bluhm