mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	net/tcp: Fix socket lookups with SO_BINDTODEVICE
Similar to69678bcd4d("udp: fix SO_BINDTODEVICE"), TCP socket lookups need to fail if dev_match is not true. Currently, a packet to a given port can match a socket bound to device when it should not. In the VRF case, this causes the lookup to hit a VRF socket and not a global socket resulting in a response trying to go through the VRF when it should not. Fixes:3fa6f616a7("net: ipv4: add second dif to inet socket lookups") Fixes:4297a0ef08("net: ipv6: add second dif to inet6 socket lookups") Reported-by: Lou Berger <lberger@labn.net> Diagnosed-by: Renato Westphal <renato@opensourcerouting.org> Tested-by: Renato Westphal <renato@opensourcerouting.org> Signed-off-by: David Ahern <dsahern@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									f696a21c22
								
							
						
					
					
						commit
						8c43bd1706
					
				
					 2 changed files with 4 additions and 4 deletions
				
			
		| 
						 | 
					@ -243,9 +243,9 @@ static inline int compute_score(struct sock *sk, struct net *net,
 | 
				
			||||||
			bool dev_match = (sk->sk_bound_dev_if == dif ||
 | 
								bool dev_match = (sk->sk_bound_dev_if == dif ||
 | 
				
			||||||
					  sk->sk_bound_dev_if == sdif);
 | 
										  sk->sk_bound_dev_if == sdif);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (exact_dif && !dev_match)
 | 
								if (!dev_match)
 | 
				
			||||||
				return -1;
 | 
									return -1;
 | 
				
			||||||
			if (sk->sk_bound_dev_if && dev_match)
 | 
								if (sk->sk_bound_dev_if)
 | 
				
			||||||
				score += 4;
 | 
									score += 4;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if (sk->sk_incoming_cpu == raw_smp_processor_id())
 | 
							if (sk->sk_incoming_cpu == raw_smp_processor_id())
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -113,9 +113,9 @@ static inline int compute_score(struct sock *sk, struct net *net,
 | 
				
			||||||
			bool dev_match = (sk->sk_bound_dev_if == dif ||
 | 
								bool dev_match = (sk->sk_bound_dev_if == dif ||
 | 
				
			||||||
					  sk->sk_bound_dev_if == sdif);
 | 
										  sk->sk_bound_dev_if == sdif);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (exact_dif && !dev_match)
 | 
								if (!dev_match)
 | 
				
			||||||
				return -1;
 | 
									return -1;
 | 
				
			||||||
			if (sk->sk_bound_dev_if && dev_match)
 | 
								if (sk->sk_bound_dev_if)
 | 
				
			||||||
				score++;
 | 
									score++;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if (sk->sk_incoming_cpu == raw_smp_processor_id())
 | 
							if (sk->sk_incoming_cpu == raw_smp_processor_id())
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue