mirror of https://gitee.com/openkylin/linux.git
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
|
@ -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 New Issue