Skip to content

Commit

Permalink
sctp: Fix regression introduced by new sctp_connectx api
Browse files Browse the repository at this point in the history
A new (unrealeased to the user) sctp_connectx api

c6ba68a
    sctp: support non-blocking version of the new sctp_connectx() API

introduced a regression cought by the user regression test
suite.  In particular, the API requires the user library to
re-allocate the buffer and could potentially trigger a SIGFAULT.

This change corrects that regression by passing the original
address buffer to the kernel unmodified, but still allows for
a returned association id.

Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Vlad Yasevich authored and davem330 committed Nov 14, 2009
1 parent 409b95a commit f9c6781
Showing 1 changed file with 13 additions and 5 deletions.
18 changes: 13 additions & 5 deletions net/sctp/socket.c
Expand Up @@ -1276,22 +1276,30 @@ SCTP_STATIC int sctp_setsockopt_connectx(struct sock* sk,
}

/*
* New (hopefully final) interface for the API. The option buffer is used
* both for the returned association id and the addresses.
* New (hopefully final) interface for the API.
* We use the sctp_getaddrs_old structure so that use-space library
* can avoid any unnecessary allocations. The only defferent part
* is that we store the actual length of the address buffer into the
* addrs_num structure member. That way we can re-use the existing
* code.
*/
SCTP_STATIC int sctp_getsockopt_connectx3(struct sock* sk, int len,
char __user *optval,
int __user *optlen)
{
struct sctp_getaddrs_old param;
sctp_assoc_t assoc_id = 0;
int err = 0;

if (len < sizeof(assoc_id))
if (len < sizeof(param))
return -EINVAL;

if (copy_from_user(&param, optval, sizeof(param)))
return -EFAULT;

err = __sctp_setsockopt_connectx(sk,
(struct sockaddr __user *)(optval + sizeof(assoc_id)),
len - sizeof(assoc_id), &assoc_id);
(struct sockaddr __user *)param.addrs,
param.addr_num, &assoc_id);

if (err == 0 || err == -EINPROGRESS) {
if (copy_to_user(optval, &assoc_id, sizeof(assoc_id)))
Expand Down

0 comments on commit f9c6781

Please sign in to comment.