diff options
Diffstat (limited to 'net/sctp/socket.c')
| -rw-r--r-- | net/sctp/socket.c | 17 | 
1 files changed, 9 insertions, 8 deletions
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index c67679a41044..c009383369b2 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -4847,7 +4847,7 @@ static int sctp_disconnect(struct sock *sk, int flags)   * descriptor will be returned from accept() to represent the newly   * formed association.   */ -static struct sock *sctp_accept(struct sock *sk, int flags, int *err, bool kern) +static struct sock *sctp_accept(struct sock *sk, struct proto_accept_arg *arg)  {  	struct sctp_sock *sp;  	struct sctp_endpoint *ep; @@ -4871,7 +4871,7 @@ static struct sock *sctp_accept(struct sock *sk, int flags, int *err, bool kern)  		goto out;  	} -	timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK); +	timeo = sock_rcvtimeo(sk, arg->flags & O_NONBLOCK);  	error = sctp_wait_for_accept(sk, timeo);  	if (error) @@ -4882,7 +4882,7 @@ static struct sock *sctp_accept(struct sock *sk, int flags, int *err, bool kern)  	 */  	asoc = list_entry(ep->asocs.next, struct sctp_association, asocs); -	newsk = sp->pf->create_accept_sk(sk, asoc, kern); +	newsk = sp->pf->create_accept_sk(sk, asoc, arg->kern);  	if (!newsk) {  		error = -ENOMEM;  		goto out; @@ -4899,7 +4899,7 @@ static struct sock *sctp_accept(struct sock *sk, int flags, int *err, bool kern)  out:  	release_sock(sk); -	*err = error; +	arg->err = error;  	return newsk;  } @@ -7119,6 +7119,7 @@ static int sctp_getsockopt_assoc_ids(struct sock *sk, int len,  	struct sctp_sock *sp = sctp_sk(sk);  	struct sctp_association *asoc;  	struct sctp_assoc_ids *ids; +	size_t ids_size;  	u32 num = 0;  	if (sctp_style(sk, TCP)) @@ -7131,11 +7132,11 @@ static int sctp_getsockopt_assoc_ids(struct sock *sk, int len,  		num++;  	} -	if (len < sizeof(struct sctp_assoc_ids) + sizeof(sctp_assoc_t) * num) +	ids_size = struct_size(ids, gaids_assoc_id, num); +	if (len < ids_size)  		return -EINVAL; -	len = sizeof(struct sctp_assoc_ids) + sizeof(sctp_assoc_t) * num; - +	len = ids_size;  	ids = kmalloc(len, GFP_USER | __GFP_NOWARN);  	if (unlikely(!ids))  		return -ENOMEM; @@ -9276,7 +9277,7 @@ void sctp_data_ready(struct sock *sk)  	if (skwq_has_sleeper(wq))  		wake_up_interruptible_sync_poll(&wq->wait, EPOLLIN |  						EPOLLRDNORM | EPOLLRDBAND); -	sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN); +	sk_wake_async_rcu(sk, SOCK_WAKE_WAITD, POLL_IN);  	rcu_read_unlock();  }  |