|
|
@@ -153,13 +153,18 @@ static int udp_lib_lport_inuse(struct net *net, __u16 num,
|
|
|
(!sk2->sk_reuse || !sk->sk_reuse) &&
|
|
|
(!sk2->sk_bound_dev_if || !sk->sk_bound_dev_if ||
|
|
|
sk2->sk_bound_dev_if == sk->sk_bound_dev_if) &&
|
|
|
- (!sk2->sk_reuseport || !sk->sk_reuseport ||
|
|
|
- rcu_access_pointer(sk->sk_reuseport_cb) ||
|
|
|
- !uid_eq(uid, sock_i_uid(sk2))) &&
|
|
|
saddr_comp(sk, sk2, true)) {
|
|
|
- if (!bitmap)
|
|
|
- return 1;
|
|
|
- __set_bit(udp_sk(sk2)->udp_port_hash >> log, bitmap);
|
|
|
+ if (sk2->sk_reuseport && sk->sk_reuseport &&
|
|
|
+ !rcu_access_pointer(sk->sk_reuseport_cb) &&
|
|
|
+ uid_eq(uid, sock_i_uid(sk2))) {
|
|
|
+ if (!bitmap)
|
|
|
+ return 0;
|
|
|
+ } else {
|
|
|
+ if (!bitmap)
|
|
|
+ return 1;
|
|
|
+ __set_bit(udp_sk(sk2)->udp_port_hash >> log,
|
|
|
+ bitmap);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
return 0;
|
|
|
@@ -188,11 +193,14 @@ static int udp_lib_lport_inuse2(struct net *net, __u16 num,
|
|
|
(!sk2->sk_reuse || !sk->sk_reuse) &&
|
|
|
(!sk2->sk_bound_dev_if || !sk->sk_bound_dev_if ||
|
|
|
sk2->sk_bound_dev_if == sk->sk_bound_dev_if) &&
|
|
|
- (!sk2->sk_reuseport || !sk->sk_reuseport ||
|
|
|
- rcu_access_pointer(sk->sk_reuseport_cb) ||
|
|
|
- !uid_eq(uid, sock_i_uid(sk2))) &&
|
|
|
saddr_comp(sk, sk2, true)) {
|
|
|
- res = 1;
|
|
|
+ if (sk2->sk_reuseport && sk->sk_reuseport &&
|
|
|
+ !rcu_access_pointer(sk->sk_reuseport_cb) &&
|
|
|
+ uid_eq(uid, sock_i_uid(sk2))) {
|
|
|
+ res = 0;
|
|
|
+ } else {
|
|
|
+ res = 1;
|
|
|
+ }
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
@@ -285,6 +293,7 @@ int udp_lib_get_port(struct sock *sk, unsigned short snum,
|
|
|
snum += rand;
|
|
|
} while (snum != first);
|
|
|
spin_unlock_bh(&hslot->lock);
|
|
|
+ cond_resched();
|
|
|
} while (++first != last);
|
|
|
goto fail;
|
|
|
} else {
|