]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - net/sctp/protocol.c
Merge branch 'drm-fixes-4.10' of git://people.freedesktop.org/~agd5f/linux into drm...
[mirror_ubuntu-artful-kernel.git] / net / sctp / protocol.c
index 7b523e3f551f1761d891b606f293b2b721a87ca8..616a9428e0c4f3ba2b2cf910f339074f79488e62 100644 (file)
@@ -205,26 +205,30 @@ int sctp_copy_local_addr_list(struct net *net, struct sctp_bind_addr *bp,
        list_for_each_entry_rcu(addr, &net->sctp.local_addr_list, list) {
                if (!addr->valid)
                        continue;
-               if (sctp_in_scope(net, &addr->a, scope)) {
-                       /* Now that the address is in scope, check to see if
-                        * the address type is really supported by the local
-                        * sock as well as the remote peer.
-                        */
-                       if ((((AF_INET == addr->a.sa.sa_family) &&
-                             (copy_flags & SCTP_ADDR4_PEERSUPP))) ||
-                           (((AF_INET6 == addr->a.sa.sa_family) &&
-                             (copy_flags & SCTP_ADDR6_ALLOWED) &&
-                             (copy_flags & SCTP_ADDR6_PEERSUPP)))) {
-                               error = sctp_add_bind_addr(bp, &addr->a,
-                                                   sizeof(addr->a),
-                                                   SCTP_ADDR_SRC, GFP_ATOMIC);
-                               if (error)
-                                       goto end_copy;
-                       }
-               }
+               if (!sctp_in_scope(net, &addr->a, scope))
+                       continue;
+
+               /* Now that the address is in scope, check to see if
+                * the address type is really supported by the local
+                * sock as well as the remote peer.
+                */
+               if (addr->a.sa.sa_family == AF_INET &&
+                   !(copy_flags & SCTP_ADDR4_PEERSUPP))
+                       continue;
+               if (addr->a.sa.sa_family == AF_INET6 &&
+                   (!(copy_flags & SCTP_ADDR6_ALLOWED) ||
+                    !(copy_flags & SCTP_ADDR6_PEERSUPP)))
+                       continue;
+
+               if (sctp_bind_addr_state(bp, &addr->a) != -1)
+                       continue;
+
+               error = sctp_add_bind_addr(bp, &addr->a, sizeof(addr->a),
+                                          SCTP_ADDR_SRC, GFP_ATOMIC);
+               if (error)
+                       break;
        }
 
-end_copy:
        rcu_read_unlock();
        return error;
 }