]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
sctp: use SCTP_FUTURE_ASSOC for SCTP_MAXSEG sockopt
authorXin Long <lucien.xin@gmail.com>
Mon, 28 Jan 2019 07:08:27 +0000 (15:08 +0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 30 Jan 2019 08:44:06 +0000 (00:44 -0800)
Check with SCTP_FUTURE_ASSOC instead in
sctp_set/getsockopt_maxseg, it's compatible with 0.
Also check asoc_id early as other sctp setsockopts does.

Signed-off-by: Xin Long <lucien.xin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sctp/socket.c

index e505e189bcefeda48c64b00eca29cc436d2576d1..f38c9127e8588e333e4d42b89873a64f871dc613 100644 (file)
@@ -3322,7 +3322,7 @@ static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, unsigned
                                    current->comm, task_pid_nr(current));
                if (copy_from_user(&val, optval, optlen))
                        return -EFAULT;
-               params.assoc_id = 0;
+               params.assoc_id = SCTP_FUTURE_ASSOC;
        } else if (optlen == sizeof(struct sctp_assoc_value)) {
                if (copy_from_user(&params, optval, optlen))
                        return -EFAULT;
@@ -3332,6 +3332,9 @@ static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, unsigned
        }
 
        asoc = sctp_id2assoc(sk, params.assoc_id);
+       if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
+           sctp_style(sk, UDP))
+               return -EINVAL;
 
        if (val) {
                int min_len, max_len;
@@ -3349,8 +3352,6 @@ static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, unsigned
                asoc->user_frag = val;
                sctp_assoc_update_frag_point(asoc);
        } else {
-               if (params.assoc_id && sctp_style(sk, UDP))
-                       return -EINVAL;
                sp->user_frag = val;
        }
 
@@ -6503,7 +6504,7 @@ static int sctp_getsockopt_maxseg(struct sock *sk, int len,
                                    "Use of int in maxseg socket option.\n"
                                    "Use struct sctp_assoc_value instead\n",
                                    current->comm, task_pid_nr(current));
-               params.assoc_id = 0;
+               params.assoc_id = SCTP_FUTURE_ASSOC;
        } else if (len >= sizeof(struct sctp_assoc_value)) {
                len = sizeof(struct sctp_assoc_value);
                if (copy_from_user(&params, optval, len))
@@ -6512,7 +6513,8 @@ static int sctp_getsockopt_maxseg(struct sock *sk, int len,
                return -EINVAL;
 
        asoc = sctp_id2assoc(sk, params.assoc_id);
-       if (!asoc && params.assoc_id && sctp_style(sk, UDP))
+       if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
+           sctp_style(sk, UDP))
                return -EINVAL;
 
        if (asoc)