]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
sctp: adjust some codes in a better order in sctp_sendmsg
authorXin Long <lucien.xin@gmail.com>
Thu, 1 Mar 2018 15:05:18 +0000 (23:05 +0800)
committerDavid S. Miller <davem@davemloft.net>
Sun, 4 Mar 2018 18:00:57 +0000 (13:00 -0500)
sctp_sendmsg_new_asoc and SCTP_ADDR_OVER check is only necessary
when daddr is set, so move them up to if (daddr) statement.

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

index a1c78fc19d957f4c287cb18f267de110c68d9075..7fa76031bb08623155de2c82d1b0ac5de0729ac8 100644 (file)
@@ -1936,38 +1936,38 @@ static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len)
 
        lock_sock(sk);
 
-       /* If a msg_name has been specified, assume this is to be used.  */
+       /* Get and check or create asoc */
        if (daddr) {
-               /* Look for a matching association on the endpoint. */
                asoc = sctp_endpoint_lookup_assoc(ep, daddr, &transport);
+               if (asoc) {
+                       err = sctp_sendmsg_check_sflags(asoc, sflags, msg,
+                                                       msg_len);
+                       if (err <= 0)
+                               goto out_unlock;
+               } else {
+                       err = sctp_sendmsg_new_asoc(sk, sflags, &cmsgs, daddr,
+                                                   &transport);
+                       if (err)
+                               goto out_unlock;
+
+                       asoc = transport->asoc;
+                       new = true;
+               }
+
+               if (!sctp_style(sk, TCP) && !(sflags & SCTP_ADDR_OVER))
+                       transport = NULL;
        } else {
                asoc = sctp_id2assoc(sk, sinfo->sinfo_assoc_id);
                if (!asoc) {
                        err = -EPIPE;
                        goto out_unlock;
                }
-       }
 
-       if (asoc) {
                err = sctp_sendmsg_check_sflags(asoc, sflags, msg, msg_len);
                if (err <= 0)
                        goto out_unlock;
        }
 
-       /* Do we need to create the association?  */
-       if (!asoc) {
-               err = sctp_sendmsg_new_asoc(sk, sflags, &cmsgs, daddr,
-                                           &transport);
-               if (err)
-                       goto out_unlock;
-
-               asoc = transport->asoc;
-               new = true;
-       }
-
-       if (!sctp_style(sk, TCP) && !(sflags & SCTP_ADDR_OVER))
-               transport = NULL;
-
        /* Update snd_info with the asoc */
        sctp_sendmsg_update_sinfo(asoc, sinfo, &cmsgs);