diff options
Diffstat (limited to 'net/sctp')
| -rw-r--r-- | net/sctp/input.c | 7 | ||||
| -rw-r--r-- | net/sctp/socket.c | 12 | 
2 files changed, 12 insertions, 7 deletions
diff --git a/net/sctp/input.c b/net/sctp/input.c index 80564fe0302..8b9b6790a3d 100644 --- a/net/sctp/input.c +++ b/net/sctp/input.c @@ -736,15 +736,12 @@ static void __sctp_unhash_endpoint(struct sctp_endpoint *ep)  	epb = &ep->base; -	if (hlist_unhashed(&epb->node)) -		return; -  	epb->hashent = sctp_ep_hashfn(epb->bind_addr.port);  	head = &sctp_ep_hashtable[epb->hashent];  	sctp_write_lock(&head->lock); -	__hlist_del(&epb->node); +	hlist_del_init(&epb->node);  	sctp_write_unlock(&head->lock);  } @@ -825,7 +822,7 @@ static void __sctp_unhash_established(struct sctp_association *asoc)  	head = &sctp_assoc_hashtable[epb->hashent];  	sctp_write_lock(&head->lock); -	__hlist_del(&epb->node); +	hlist_del_init(&epb->node);  	sctp_write_unlock(&head->lock);  } diff --git a/net/sctp/socket.c b/net/sctp/socket.c index b3b8a8d813e..31c7bfcd9b5 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -1231,8 +1231,14 @@ out_free:  	SCTP_DEBUG_PRINTK("About to exit __sctp_connect() free asoc: %p"  			  " kaddrs: %p err: %d\n",  			  asoc, kaddrs, err); -	if (asoc) +	if (asoc) { +		/* sctp_primitive_ASSOCIATE may have added this association +		 * To the hash table, try to unhash it, just in case, its a noop +		 * if it wasn't hashed so we're safe +		 */ +		sctp_unhash_established(asoc);  		sctp_association_free(asoc); +	}  	return err;  } @@ -1942,8 +1948,10 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,  	goto out_unlock;  out_free: -	if (new_asoc) +	if (new_asoc) { +		sctp_unhash_established(asoc);  		sctp_association_free(asoc); +	}  out_unlock:  	sctp_release_sock(sk);  |