Re: [PATCH nf] netfilter: nft_set_rbtree: bogus lookup/get on consecutive elements in named sets

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Dec 06, 2019 at 08:26:47PM +0100, Pablo Neira Ayuso wrote:
> On Thu, Dec 05, 2019 at 11:04:08PM +0100, Phil Sutter wrote:
> > Hi Pablo,
> > 
> > On Thu, Dec 05, 2019 at 07:07:06PM +0100, Pablo Neira Ayuso wrote:
> > > The existing rbtree implementation might store consecutive elements
> > > where the closing element and the opening element might overlap, eg.
> > > 
> > > 	[ a, a+1) [ a+1, a+2)
> > > 
> > > This patch removes the optimization for non-anonymous sets in the exact
> > > matching case, where it is assumed to stop searching in case that the
> > > closing element is found. Instead, invalidate candidate interval and
> > > keep looking further in the tree.
> > > 
> > > This patch fixes the lookup and get operations.
> > 
> > I didn't get what the actual problem is?
> 
> The lookup/get results false, while there is an element in the rbtree.
> Moreover, the get operation returns true as if a+2 would be in the
> tree. This happens with named sets after several set updates, I could
> reproduce the issue with several elements mixed with insertion and
> deletions in one batch.

To extend the problem description: The issue is that the existing
lookup optimization (that only works for the anonymous sets) might not
reach the opening [ a+1, ... element if the closing ... , a+1) is
found in first place when walking over the rbtree. Hence, walking the
full tree in that case is needed.

> I managed to trigger the problem using the test file coming in this
> patch: https://patchwork.ozlabs.org/patch/1204779/
> 
> I can extend the patch description if you like.
> 
> > [...]
> > > diff --git a/net/netfilter/nft_set_rbtree.c b/net/netfilter/nft_set_rbtree.c
> > > index 57123259452f..510169e28065 100644
> > > --- a/net/netfilter/nft_set_rbtree.c
> > > +++ b/net/netfilter/nft_set_rbtree.c
> > [...]
> > > @@ -141,6 +146,8 @@ static bool __nft_rbtree_get(const struct net *net, const struct nft_set *set,
> > >  		} else {
> > >  			if (!nft_set_elem_active(&rbe->ext, genmask))
> > >  				parent = rcu_dereference_raw(parent->rb_left);
> > > +				continue;
> > > +			}
> > >  
> > >  			if (!nft_set_ext_exists(&rbe->ext, NFT_SET_EXT_FLAGS) ||
> > >  			    (*nft_set_ext_flags(&rbe->ext) & NFT_SET_ELEM_INTERVAL_END) ==
> > 
> > Are you sure about that chunk? It adds a closing brace without a
> > matching opening one. Either this patch ignores whitespace change or
> > there's something fishy. :)
> 
> Yes, I botched it when squashing my patches before submission. I just
> sent a v2.
> 
> Thanks.
> 
> 



[Index of Archives]     [Netfitler Users]     [Berkeley Packet Filter]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux