| From foo@baz Wed Nov 21 13:17:56 CET 2018 |
| From: Xin Long <lucien.xin@gmail.com> |
| Date: Sun, 18 Nov 2018 15:21:53 +0800 |
| Subject: sctp: not allow to set asoc prsctp_enable by sockopt |
| |
| From: Xin Long <lucien.xin@gmail.com> |
| |
| [ Upstream commit cc3ccf26f0649089b3a34a2781977755ea36e72c ] |
| |
| As rfc7496#section4.5 says about SCTP_PR_SUPPORTED: |
| |
| This socket option allows the enabling or disabling of the |
| negotiation of PR-SCTP support for future associations. For existing |
| associations, it allows one to query whether or not PR-SCTP support |
| was negotiated on a particular association. |
| |
| It means only sctp sock's prsctp_enable can be set. |
| |
| Note that for the limitation of SCTP_{CURRENT|ALL}_ASSOC, we will |
| add it when introducing SCTP_{FUTURE|CURRENT|ALL}_ASSOC for linux |
| sctp in another patchset. |
| |
| v1->v2: |
| - drop the params.assoc_id check as Neil suggested. |
| |
| Fixes: 28aa4c26fce2 ("sctp: add SCTP_PR_SUPPORTED on sctp sockopt") |
| Reported-by: Ying Xu <yinxu@redhat.com> |
| Signed-off-by: Xin Long <lucien.xin@gmail.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/sctp/socket.c | 26 +++++--------------------- |
| 1 file changed, 5 insertions(+), 21 deletions(-) |
| |
| --- a/net/sctp/socket.c |
| +++ b/net/sctp/socket.c |
| @@ -3732,32 +3732,16 @@ static int sctp_setsockopt_pr_supported( |
| unsigned int optlen) |
| { |
| struct sctp_assoc_value params; |
| - struct sctp_association *asoc; |
| - int retval = -EINVAL; |
| |
| if (optlen != sizeof(params)) |
| - goto out; |
| + return -EINVAL; |
| |
| - if (copy_from_user(¶ms, optval, optlen)) { |
| - retval = -EFAULT; |
| - goto out; |
| - } |
| + if (copy_from_user(¶ms, optval, optlen)) |
| + return -EFAULT; |
| |
| - asoc = sctp_id2assoc(sk, params.assoc_id); |
| - if (asoc) { |
| - asoc->prsctp_enable = !!params.assoc_value; |
| - } else if (!params.assoc_id) { |
| - struct sctp_sock *sp = sctp_sk(sk); |
| + sctp_sk(sk)->ep->prsctp_enable = !!params.assoc_value; |
| |
| - sp->ep->prsctp_enable = !!params.assoc_value; |
| - } else { |
| - goto out; |
| - } |
| - |
| - retval = 0; |
| - |
| -out: |
| - return retval; |
| + return 0; |
| } |
| |
| static int sctp_setsockopt_default_prinfo(struct sock *sk, |