Thread (6 messages) 6 messages, 3 authors, 2018-11-16

Re: [PATCH net] sctp: not allow to set asoc prsctp_enable by sockopt

From: Xin Long <lucien.xin@gmail.com>
Date: 2018-11-16 16:53:25
Also in: linux-sctp

On Fri, Nov 16, 2018 at 2:22 AM Marcelo Ricardo Leitner
[off-list ref] wrote:
On Thu, Nov 15, 2018 at 07:14:28PM +0800, Xin Long wrote:
quoted
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.

Fixes: 28aa4c26fce2 ("sctp: add SCTP_PR_SUPPORTED on sctp sockopt")
Reported-by: Ying Xu <redacted>
Signed-off-by: Xin Long <lucien.xin@gmail.com>
---
 net/sctp/socket.c | 13 +++----------
 1 file changed, 3 insertions(+), 10 deletions(-)
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index 739f3e5..e9b8232 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -3940,7 +3940,6 @@ static int sctp_setsockopt_pr_supported(struct sock *sk,
                                      unsigned int optlen)
 {
      struct sctp_assoc_value params;
-     struct sctp_association *asoc;
      int retval = -EINVAL;

      if (optlen != sizeof(params))
@@ -3951,16 +3950,10 @@ static int sctp_setsockopt_pr_supported(struct sock *sk,
              goto out;
      }

-     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);
-
-             sp->ep->prsctp_enable = !!params.assoc_value;
-     } else {
+     if (sctp_style(sk, UDP) && sctp_id2assoc(sk, params.assoc_id))
I got this semantic from BSD's SCTP_PR_SUPPORTED sockopt:
                        SCTP_FIND_STCB(inp, stcb, av->assoc_id);

                        if (stcb) {
                                SCTP_LTRACE_ERR_RET(...);
                                error = EINVAL;
                                SCTP_TCB_UNLOCK(stcb);
                        } else {
                                ...
                        }
This would allow using a non-existent assoc id on UDP-style sockets to
set it at the socket, which is not expected. It should be more like:

+       if (sctp_style(sk, UDP) && params.assoc_id)
This way is more strict, but it seems reasonable.

When a user sets params.assoc_id for UDP type socket, it should be
thought as he WANTs to apply this on assoc, which is not allowed here.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help