]> Pileus Git - ~andy/linux/blobdiff - net/sctp/endpointola.c
sctp: bail from sctp_endpoint_lookup_assoc() if not bound
[~andy/linux] / net / sctp / endpointola.c
index e10acc01c75f90600f6c1cbb59a2e4610977fc96..c8cc24e282c38697ac1cddd072cb983670dd55d3 100644 (file)
@@ -325,6 +325,7 @@ static struct sctp_association *__sctp_endpoint_lookup_assoc(
        struct sctp_transport **transport)
 {
        struct sctp_association *asoc = NULL;
+       struct sctp_association *tmp;
        struct sctp_transport *t = NULL;
        struct sctp_hashbucket *head;
        struct sctp_ep_common *epb;
@@ -333,25 +334,32 @@ static struct sctp_association *__sctp_endpoint_lookup_assoc(
        int rport;
 
        *transport = NULL;
+
+       /* If the local port is not set, there can't be any associations
+        * on this endpoint.
+        */
+       if (!ep->base.bind_addr.port)
+               goto out;
+
        rport = ntohs(paddr->v4.sin_port);
 
        hash = sctp_assoc_hashfn(ep->base.bind_addr.port, rport);
        head = &sctp_assoc_hashtable[hash];
        read_lock(&head->lock);
        sctp_for_each_hentry(epb, node, &head->chain) {
-               asoc = sctp_assoc(epb);
-               if (asoc->ep != ep || rport != asoc->peer.port)
-                       goto next;
+               tmp = sctp_assoc(epb);
+               if (tmp->ep != ep || rport != tmp->peer.port)
+                       continue;
 
-               t = sctp_assoc_lookup_paddr(asoc, paddr);
+               t = sctp_assoc_lookup_paddr(tmp, paddr);
                if (t) {
+                       asoc = tmp;
                        *transport = t;
                        break;
                }
-next:
-               asoc = NULL;
        }
        read_unlock(&head->lock);
+out:
        return asoc;
 }