Check with SCTP_ALL_ASSOC instead in sctp_setsockopt_enable_strreset and
check with SCTP_FUTURE_ASSOC instead in sctp_getsockopt_enable_strreset,
it's compatible with 0.

SCTP_CURRENT_ASSOC is supported for SCTP_ENABLE_STREAM_RESET in this patch.
It also adjusts some code to keep a same check form as other functions.

Signed-off-by: Xin Long <lucien....@gmail.com>
---
 net/sctp/socket.c | 33 ++++++++++++++++++++-------------
 1 file changed, 20 insertions(+), 13 deletions(-)

diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index 2f70171..93004c7 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -4222,6 +4222,7 @@ static int sctp_setsockopt_enable_strreset(struct sock 
*sk,
                                           char __user *optval,
                                           unsigned int optlen)
 {
+       struct sctp_endpoint *ep = sctp_sk(sk)->ep;
        struct sctp_assoc_value params;
        struct sctp_association *asoc;
        int retval = -EINVAL;
@@ -4238,17 +4239,25 @@ static int sctp_setsockopt_enable_strreset(struct sock 
*sk,
                goto out;
 
        asoc = sctp_id2assoc(sk, params.assoc_id);
+       if (!asoc && params.assoc_id > SCTP_ALL_ASSOC &&
+           sctp_style(sk, UDP))
+               goto out;
+
+       retval = 0;
+
        if (asoc) {
                asoc->strreset_enable = params.assoc_value;
-       } else if (!params.assoc_id) {
-               struct sctp_sock *sp = sctp_sk(sk);
-
-               sp->ep->strreset_enable = params.assoc_value;
-       } else {
                goto out;
        }
 
-       retval = 0;
+       if (params.assoc_id == SCTP_FUTURE_ASSOC ||
+           params.assoc_id == SCTP_ALL_ASSOC)
+               ep->strreset_enable = params.assoc_value;
+
+       if (params.assoc_id == SCTP_CURRENT_ASSOC ||
+           params.assoc_id == SCTP_ALL_ASSOC)
+               list_for_each_entry(asoc, &ep->asocs, asocs)
+                       asoc->strreset_enable = params.assoc_value;
 
 out:
        return retval;
@@ -7509,17 +7518,15 @@ static int sctp_getsockopt_enable_strreset(struct sock 
*sk, int len,
                goto out;
 
        asoc = sctp_id2assoc(sk, params.assoc_id);
-       if (asoc) {
-               params.assoc_value = asoc->strreset_enable;
-       } else if (!params.assoc_id) {
-               struct sctp_sock *sp = sctp_sk(sk);
-
-               params.assoc_value = sp->ep->strreset_enable;
-       } else {
+       if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
+           sctp_style(sk, UDP)) {
                retval = -EINVAL;
                goto out;
        }
 
+       params.assoc_value = asoc ? asoc->strreset_enable
+                                 : sctp_sk(sk)->ep->strreset_enable;
+
        if (put_user(len, optlen))
                goto out;
 
-- 
2.1.0

Reply via email to