diff options
Diffstat (limited to 'net/sctp/endpointola.c')
| -rw-r--r-- | net/sctp/endpointola.c | 20 | 
1 files changed, 14 insertions, 6 deletions
diff --git a/net/sctp/endpointola.c b/net/sctp/endpointola.c index e10acc01c75..c8cc24e282c 100644 --- a/net/sctp/endpointola.c +++ b/net/sctp/endpointola.c @@ -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;  }  |