diff options
Diffstat (limited to 'net/tipc')
| -rw-r--r-- | net/tipc/socket.c | 8 | ||||
| -rw-r--r-- | net/tipc/subscr.c | 7 | 
2 files changed, 11 insertions, 4 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 43e4045e72bc..7130e73bd42c 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -115,7 +115,8 @@ static void tipc_data_ready(struct sock *sk);  static void tipc_write_space(struct sock *sk);  static void tipc_sock_destruct(struct sock *sk);  static int tipc_release(struct socket *sock); -static int tipc_accept(struct socket *sock, struct socket *new_sock, int flags); +static int tipc_accept(struct socket *sock, struct socket *new_sock, int flags, +		       bool kern);  static void tipc_sk_timeout(unsigned long data);  static int tipc_sk_publish(struct tipc_sock *tsk, uint scope,  			   struct tipc_name_seq const *seq); @@ -2029,7 +2030,8 @@ static int tipc_wait_for_accept(struct socket *sock, long timeo)   *   * Returns 0 on success, errno otherwise   */ -static int tipc_accept(struct socket *sock, struct socket *new_sock, int flags) +static int tipc_accept(struct socket *sock, struct socket *new_sock, int flags, +		       bool kern)  {  	struct sock *new_sk, *sk = sock->sk;  	struct sk_buff *buf; @@ -2051,7 +2053,7 @@ static int tipc_accept(struct socket *sock, struct socket *new_sock, int flags)  	buf = skb_peek(&sk->sk_receive_queue); -	res = tipc_sk_create(sock_net(sock->sk), new_sock, 0, 0); +	res = tipc_sk_create(sock_net(sock->sk), new_sock, 0, kern);  	if (res)  		goto exit;  	security_sk_clone(sock->sk, new_sock->sk); diff --git a/net/tipc/subscr.c b/net/tipc/subscr.c index 9d94e65d0894..271cd66e4b3b 100644 --- a/net/tipc/subscr.c +++ b/net/tipc/subscr.c @@ -141,6 +141,11 @@ void tipc_subscrp_report_overlap(struct tipc_subscription *sub, u32 found_lower,  static void tipc_subscrp_timeout(unsigned long data)  {  	struct tipc_subscription *sub = (struct tipc_subscription *)data; +	struct tipc_subscriber *subscriber = sub->subscriber; + +	spin_lock_bh(&subscriber->lock); +	tipc_nametbl_unsubscribe(sub); +	spin_unlock_bh(&subscriber->lock);  	/* Notify subscriber of timeout */  	tipc_subscrp_send_event(sub, sub->evt.s.seq.lower, sub->evt.s.seq.upper, @@ -173,7 +178,6 @@ static void tipc_subscrp_kref_release(struct kref *kref)  	struct tipc_subscriber *subscriber = sub->subscriber;  	spin_lock_bh(&subscriber->lock); -	tipc_nametbl_unsubscribe(sub);  	list_del(&sub->subscrp_list);  	atomic_dec(&tn->subscription_count);  	spin_unlock_bh(&subscriber->lock); @@ -205,6 +209,7 @@ static void tipc_subscrb_subscrp_delete(struct tipc_subscriber *subscriber,  		if (s && memcmp(s, &sub->evt.s, sizeof(struct tipc_subscr)))  			continue; +		tipc_nametbl_unsubscribe(sub);  		tipc_subscrp_get(sub);  		spin_unlock_bh(&subscriber->lock);  		tipc_subscrp_delete(sub);  | 
