diff options
author | Xin Long <lucien.xin@gmail.com> | 2019-01-28 15:08:30 +0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-01-30 00:44:07 -0800 |
commit | fb1956050846331358ecd259cc1b632a092d73ff (patch) | |
tree | 37e7e43de31aafa523b17d17def342ad339a451b /net/sctp | |
parent | 8add543e369d67ccd42f7e67d68866b4d606f632 (diff) | |
download | linux-fb1956050846331358ecd259cc1b632a092d73ff.tar.bz2 |
sctp: use SCTP_FUTURE_ASSOC for SCTP_PR_SUPPORTED sockopt
Check with SCTP_FUTURE_ASSOC instead in
sctp_set/getsockopt_pr_supported, it's compatible with 0.
It also adjusts some code to keep a same check form as other functions.
Signed-off-by: Xin Long <lucien.xin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sctp')
-rw-r--r-- | net/sctp/socket.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 1d49b7dfcba2..9e2b15318942 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -3965,6 +3965,7 @@ static int sctp_setsockopt_pr_supported(struct sock *sk, unsigned int optlen) { struct sctp_assoc_value params; + struct sctp_association *asoc; if (optlen != sizeof(params)) return -EINVAL; @@ -3972,6 +3973,11 @@ static int sctp_setsockopt_pr_supported(struct sock *sk, if (copy_from_user(¶ms, optval, optlen)) return -EFAULT; + asoc = sctp_id2assoc(sk, params.assoc_id); + if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && + sctp_style(sk, UDP)) + return -EINVAL; + sctp_sk(sk)->ep->prsctp_enable = !!params.assoc_value; return 0; @@ -7084,17 +7090,15 @@ static int sctp_getsockopt_pr_supported(struct sock *sk, int len, goto out; asoc = sctp_id2assoc(sk, params.assoc_id); - if (asoc) { - params.assoc_value = asoc->prsctp_enable; - } else if (!params.assoc_id) { - struct sctp_sock *sp = sctp_sk(sk); - - params.assoc_value = sp->ep->prsctp_enable; - } else { + if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && + sctp_style(sk, UDP)) { retval = -EINVAL; goto out; } + params.assoc_value = asoc ? asoc->prsctp_enable + : sctp_sk(sk)->ep->prsctp_enable; + if (put_user(len, optlen)) goto out; |