diff options
Diffstat (limited to 'net/sctp/socket.c')
| -rw-r--r-- | net/sctp/socket.c | 17 | 
1 files changed, 10 insertions, 7 deletions
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 3204a9b29407..b4fb6e4886d2 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -188,13 +188,13 @@ static void sctp_for_each_tx_datachunk(struct sctp_association *asoc,  		list_for_each_entry(chunk, &t->transmitted, transmitted_list)  			cb(chunk); -	list_for_each_entry(chunk, &q->retransmit, list) +	list_for_each_entry(chunk, &q->retransmit, transmitted_list)  		cb(chunk); -	list_for_each_entry(chunk, &q->sacked, list) +	list_for_each_entry(chunk, &q->sacked, transmitted_list)  		cb(chunk); -	list_for_each_entry(chunk, &q->abandoned, list) +	list_for_each_entry(chunk, &q->abandoned, transmitted_list)  		cb(chunk);  	list_for_each_entry(chunk, &q->out_chunk_list, list) @@ -3891,13 +3891,17 @@ static int sctp_setsockopt_reset_streams(struct sock *sk,  	struct sctp_association *asoc;  	int retval = -EINVAL; -	if (optlen < sizeof(struct sctp_reset_streams)) +	if (optlen < sizeof(*params))  		return -EINVAL;  	params = memdup_user(optval, optlen);  	if (IS_ERR(params))  		return PTR_ERR(params); +	if (params->srs_number_streams * sizeof(__u16) > +	    optlen - sizeof(*params)) +		goto out; +  	asoc = sctp_id2assoc(sk, params->srs_assoc_id);  	if (!asoc)  		goto out; @@ -4494,7 +4498,7 @@ static int sctp_init_sock(struct sock *sk)  	SCTP_DBG_OBJCNT_INC(sock);  	local_bh_disable(); -	percpu_counter_inc(&sctp_sockets_allocated); +	sk_sockets_allocated_inc(sk);  	sock_prot_inuse_add(net, sk->sk_prot, 1);  	/* Nothing can fail after this block, otherwise @@ -4538,7 +4542,7 @@ static void sctp_destroy_sock(struct sock *sk)  	}  	sctp_endpoint_free(sp->ep);  	local_bh_disable(); -	percpu_counter_dec(&sctp_sockets_allocated); +	sk_sockets_allocated_dec(sk);  	sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);  	local_bh_enable();  } @@ -5080,7 +5084,6 @@ static int sctp_getsockopt_peeloff_common(struct sock *sk, sctp_peeloff_arg_t *p  	*newfile = sock_alloc_file(newsock, 0, NULL);  	if (IS_ERR(*newfile)) {  		put_unused_fd(retval); -		sock_release(newsock);  		retval = PTR_ERR(*newfile);  		*newfile = NULL;  		return retval;  | 
