sctp: try harder to figure out address family when checking wildcards
[firefly-linux-kernel-4.4.55.git] / net / sctp / bind_addr.c
index f62bc24689353557c5f11232cdd0230c9598d6d4..6d5944a745d4e3d709ef2660389638d65882a1bc 100644 (file)
@@ -457,7 +457,7 @@ static int sctp_copy_one_addr(struct sctp_bind_addr *dest,
 {
        int error = 0;
 
-       if (sctp_is_any(addr)) {
+       if (sctp_is_any(NULL, addr)) {
                error = sctp_copy_local_addr_list(dest, scope, gfp, flags);
        } else if (sctp_in_scope(addr, scope)) {
                /* Now that the address is in scope, check to see if
@@ -477,11 +477,21 @@ static int sctp_copy_one_addr(struct sctp_bind_addr *dest,
 }
 
 /* Is this a wildcard address?  */
-int sctp_is_any(const union sctp_addr *addr)
+int sctp_is_any(struct sock *sk, const union sctp_addr *addr)
 {
-       struct sctp_af *af = sctp_get_af_specific(addr->sa.sa_family);
+       unsigned short fam = 0;
+       struct sctp_af *af;
+
+       /* Try to get the right address family */
+       if (addr->sa.sa_family != AF_UNSPEC)
+               fam = addr->sa.sa_family;
+       else if (sk)
+               fam = sk->sk_family;
+
+       af = sctp_get_af_specific(fam);
        if (!af)
                return 0;
+
        return af->is_any(addr);
 }