On Wed, May 27, 2015 at 10:39 +0200, Alexandr Nedvedicky wrote: > Hello, > > > > - if (pf_state_insert(BOUND_IFACE(r, pd->kif), skw, sks, s)) { > > > - pf_state_key_detach(s, PF_SK_STACK); > > > - pf_state_key_detach(s, PF_SK_WIRE); > > > > This bug is not yours, but doing two pf_state_key_detach is wrong > > and results in all kinds of protection fault fireworks. The right > > thing is to do pf_detach_state that would handle the case where > > PF_SK_STACK == PF_SK_WIRE (i.e. we need only one invocation). > good catch. > > > > > In csfailed case we do pf_remove_src_node and then call > > pf_src_tree_remove_state. With your diff this means that > > pf_src_tree_remove_state will be dereferencing sni->sn that > > might be pool_put by the pf_remove_src_node. Therefore their > > order needs to be reversed. > > I see. Another option to fix it would be to do: > > sni->sn = sns[i]; > sns[i] = NULL; >
I'm not sure I follow. Where do you want to do it? If it's when we pool_get sni's, then this would mean we won't run pf_remove_src_node and cleanup source nodes that might have been created. > since your fix works my comment is kind of bikeshedding. > > regards > sasha >