mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	udp: fix SO_BINDTODEVICE
Damir reported a breakage of SO_BINDTODEVICE for UDP sockets. In absence of VRF devices, after commitfb74c27735("net: ipv4: add second dif to udp socket lookups") the dif mismatch isn't fatal anymore for UDP socket lookup with non null sk_bound_dev_if, breaking SO_BINDTODEVICE semantics. This changeset addresses the issue making the dif match mandatory again in the above scenario. Reported-by: Damir Mansurov <dnman@oktetlabs.ru> Fixes:fb74c27735("net: ipv4: add second dif to udp socket lookups") Fixes:1801b570dd("net: ipv6: add second dif to udp socket lookups") Signed-off-by: Paolo Abeni <pabeni@redhat.com> Acked-by: David Ahern <dsahern@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									0e8411e426
								
							
						
					
					
						commit
						69678bcd4d
					
				
					 2 changed files with 4 additions and 4 deletions
				
			
		| 
						 | 
					@ -401,9 +401,9 @@ static 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;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -148,9 +148,9 @@ static 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++;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue