inetpeer: fix RCU lookup()
Excess of seafood or something happened while I cooked the commit
adding RB tree to inetpeer.
Of course, RCU rules need to be respected or bad things can happen.
In this particular loop, we need to read *pp once per iteration, not
twice.
Fixes: b145425f26 ("inetpeer: remove AVL implementation in favor of RB tree")
Reported-by: John Sperbeck <jsperbeck@google.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
			
			
This commit is contained in:
		
							parent
							
								
									bbd9644e84
								
							
						
					
					
						commit
						4cc5b44b29
					
				| @ -102,15 +102,18 @@ static struct inet_peer *lookup(const struct inetpeer_addr *daddr, | ||||
| 				struct rb_node **parent_p, | ||||
| 				struct rb_node ***pp_p) | ||||
| { | ||||
| 	struct rb_node **pp, *parent; | ||||
| 	struct rb_node **pp, *parent, *next; | ||||
| 	struct inet_peer *p; | ||||
| 
 | ||||
| 	pp = &base->rb_root.rb_node; | ||||
| 	parent = NULL; | ||||
| 	while (*pp) { | ||||
| 	while (1) { | ||||
| 		int cmp; | ||||
| 
 | ||||
| 		parent = rcu_dereference_raw(*pp); | ||||
| 		next = rcu_dereference_raw(*pp); | ||||
| 		if (!next) | ||||
| 			break; | ||||
| 		parent = next; | ||||
| 		p = rb_entry(parent, struct inet_peer, rb_node); | ||||
| 		cmp = inetpeer_addr_cmp(daddr, &p->daddr); | ||||
| 		if (cmp == 0) { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user