diff options
Diffstat (limited to 'net/tipc')
| -rw-r--r-- | net/tipc/bearer.c | 9 | ||||
| -rw-r--r-- | net/tipc/server.c | 15 | ||||
| -rw-r--r-- | net/tipc/socket.c | 4 | 
3 files changed, 21 insertions, 7 deletions
| diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c index cb29ef7ba2f..609c30c8081 100644 --- a/net/tipc/bearer.c +++ b/net/tipc/bearer.c @@ -460,6 +460,7 @@ static void bearer_disable(struct tipc_bearer *b_ptr)  {  	struct tipc_link *l_ptr;  	struct tipc_link *temp_l_ptr; +	struct tipc_link_req *temp_req;  	pr_info("Disabling bearer <%s>\n", b_ptr->name);  	spin_lock_bh(&b_ptr->lock); @@ -468,9 +469,13 @@ static void bearer_disable(struct tipc_bearer *b_ptr)  	list_for_each_entry_safe(l_ptr, temp_l_ptr, &b_ptr->links, link_list) {  		tipc_link_delete(l_ptr);  	} -	if (b_ptr->link_req) -		tipc_disc_delete(b_ptr->link_req); +	temp_req = b_ptr->link_req; +	b_ptr->link_req = NULL;  	spin_unlock_bh(&b_ptr->lock); + +	if (temp_req) +		tipc_disc_delete(temp_req); +  	memset(b_ptr, 0, sizeof(struct tipc_bearer));  } diff --git a/net/tipc/server.c b/net/tipc/server.c index 19da5abe0fa..fd3fa57a410 100644 --- a/net/tipc/server.c +++ b/net/tipc/server.c @@ -355,8 +355,12 @@ static int tipc_open_listening_sock(struct tipc_server *s)  		return PTR_ERR(con);  	sock = tipc_create_listen_sock(con); -	if (!sock) +	if (!sock) { +		idr_remove(&s->conn_idr, con->conid); +		s->idr_in_use--; +		kfree(con);  		return -EINVAL; +	}  	tipc_register_callbacks(sock, con);  	return 0; @@ -563,9 +567,14 @@ int tipc_server_start(struct tipc_server *s)  		kmem_cache_destroy(s->rcvbuf_cache);  		return ret;  	} +	ret = tipc_open_listening_sock(s); +	if (ret < 0) { +		tipc_work_stop(s); +		kmem_cache_destroy(s->rcvbuf_cache); +		return ret; +	}  	s->enabled = 1; - -	return tipc_open_listening_sock(s); +	return ret;  }  void tipc_server_stop(struct tipc_server *s) diff --git a/net/tipc/socket.c b/net/tipc/socket.c index ce8249c7682..6cc7ddd2fb7 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -1257,7 +1257,7 @@ static u32 filter_connect(struct tipc_sock *tsock, struct sk_buff **buf)  		/* Accept only ACK or NACK message */  		if (unlikely(msg_errcode(msg))) {  			sock->state = SS_DISCONNECTING; -			sk->sk_err = -ECONNREFUSED; +			sk->sk_err = ECONNREFUSED;  			retval = TIPC_OK;  			break;  		} @@ -1268,7 +1268,7 @@ static u32 filter_connect(struct tipc_sock *tsock, struct sk_buff **buf)  		res = auto_connect(sock, msg);  		if (res) {  			sock->state = SS_DISCONNECTING; -			sk->sk_err = res; +			sk->sk_err = -res;  			retval = TIPC_OK;  			break;  		} | 
