|
@@ -164,9 +164,14 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
|
|
|
if (sk->sk_type == SOCK_RAW)
|
|
|
break;
|
|
|
|
|
|
- if (sk->sk_protocol != IPPROTO_UDP &&
|
|
|
- sk->sk_protocol != IPPROTO_UDPLITE &&
|
|
|
- sk->sk_protocol != IPPROTO_TCP)
|
|
|
+ if (sk->sk_protocol == IPPROTO_UDP ||
|
|
|
+ sk->sk_protocol == IPPROTO_UDPLITE) {
|
|
|
+ struct udp_sock *up = udp_sk(sk);
|
|
|
+ if (up->pending == AF_INET6) {
|
|
|
+ retv = -EBUSY;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ } else if (sk->sk_protocol != IPPROTO_TCP)
|
|
|
break;
|
|
|
|
|
|
if (sk->sk_state != TCP_ESTABLISHED) {
|