diff options
Diffstat (limited to 'net/tipc')
| -rw-r--r-- | net/tipc/group.c | 3 | ||||
| -rw-r--r-- | net/tipc/net.c | 5 | ||||
| -rw-r--r-- | net/tipc/node.c | 7 | ||||
| -rw-r--r-- | net/tipc/socket.c | 22 | ||||
| -rw-r--r-- | net/tipc/topsrv.c | 1 | 
5 files changed, 26 insertions, 12 deletions
| diff --git a/net/tipc/group.c b/net/tipc/group.c index 06fee142f09f..63f39201e41e 100644 --- a/net/tipc/group.c +++ b/net/tipc/group.c @@ -919,6 +919,9 @@ int tipc_group_fill_sock_diag(struct tipc_group *grp, struct sk_buff *skb)  {  	struct nlattr *group = nla_nest_start(skb, TIPC_NLA_SOCK_GROUP); +	if (!group) +		return -EMSGSIZE; +  	if (nla_put_u32(skb, TIPC_NLA_SOCK_GROUP_ID,  			grp->type) ||  	    nla_put_u32(skb, TIPC_NLA_SOCK_GROUP_INSTANCE, diff --git a/net/tipc/net.c b/net/tipc/net.c index f076edb74338..7ce1e86b024f 100644 --- a/net/tipc/net.c +++ b/net/tipc/net.c @@ -163,12 +163,9 @@ void tipc_sched_net_finalize(struct net *net, u32 addr)  void tipc_net_stop(struct net *net)  { -	u32 self = tipc_own_addr(net); - -	if (!self) +	if (!tipc_own_id(net))  		return; -	tipc_nametbl_withdraw(net, TIPC_CFG_SRV, self, self, self);  	rtnl_lock();  	tipc_bearer_stop(net);  	tipc_node_stop(net); diff --git a/net/tipc/node.c b/net/tipc/node.c index 2dc4919ab23c..dd3b6dc17662 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c @@ -817,10 +817,10 @@ static void __tipc_node_link_down(struct tipc_node *n, int *bearer_id,  static void tipc_node_link_down(struct tipc_node *n, int bearer_id, bool delete)  {  	struct tipc_link_entry *le = &n->links[bearer_id]; +	struct tipc_media_addr *maddr = NULL;  	struct tipc_link *l = le->link; -	struct tipc_media_addr *maddr; -	struct sk_buff_head xmitq;  	int old_bearer_id = bearer_id; +	struct sk_buff_head xmitq;  	if (!l)  		return; @@ -844,7 +844,8 @@ static void tipc_node_link_down(struct tipc_node *n, int bearer_id, bool delete)  	tipc_node_write_unlock(n);  	if (delete)  		tipc_mon_remove_peer(n->net, n->addr, old_bearer_id); -	tipc_bearer_xmit(n->net, bearer_id, &xmitq, maddr); +	if (!skb_queue_empty(&xmitq)) +		tipc_bearer_xmit(n->net, bearer_id, &xmitq, maddr);  	tipc_sk_rcv(n->net, &le->inputq);  } diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 3274ef625dba..b542f14ed444 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -2349,6 +2349,16 @@ static int tipc_wait_for_connect(struct socket *sock, long *timeo_p)  	return 0;  } +static bool tipc_sockaddr_is_sane(struct sockaddr_tipc *addr) +{ +	if (addr->family != AF_TIPC) +		return false; +	if (addr->addrtype == TIPC_SERVICE_RANGE) +		return (addr->addr.nameseq.lower <= addr->addr.nameseq.upper); +	return (addr->addrtype == TIPC_SERVICE_ADDR || +		addr->addrtype == TIPC_SOCKET_ADDR); +} +  /**   * tipc_connect - establish a connection to another TIPC port   * @sock: socket structure @@ -2384,18 +2394,18 @@ static int tipc_connect(struct socket *sock, struct sockaddr *dest,  		if (!tipc_sk_type_connectionless(sk))  			res = -EINVAL;  		goto exit; -	} else if (dst->family != AF_TIPC) { -		res = -EINVAL;  	} -	if (dst->addrtype != TIPC_ADDR_ID && dst->addrtype != TIPC_ADDR_NAME) +	if (!tipc_sockaddr_is_sane(dst)) {  		res = -EINVAL; -	if (res)  		goto exit; - +	}  	/* DGRAM/RDM connect(), just save the destaddr */  	if (tipc_sk_type_connectionless(sk)) {  		memcpy(&tsk->peer, dest, destlen);  		goto exit; +	} else if (dst->addrtype == TIPC_SERVICE_RANGE) { +		res = -EINVAL; +		goto exit;  	}  	previous = sk->sk_state; @@ -3255,6 +3265,8 @@ static int __tipc_nl_add_sk_con(struct sk_buff *skb, struct tipc_sock *tsk)  	peer_port = tsk_peer_port(tsk);  	nest = nla_nest_start(skb, TIPC_NLA_SOCK_CON); +	if (!nest) +		return -EMSGSIZE;  	if (nla_put_u32(skb, TIPC_NLA_CON_NODE, peer_node))  		goto msg_full; diff --git a/net/tipc/topsrv.c b/net/tipc/topsrv.c index 4a708a4e8583..b45932d78004 100644 --- a/net/tipc/topsrv.c +++ b/net/tipc/topsrv.c @@ -363,6 +363,7 @@ static int tipc_conn_rcv_sub(struct tipc_topsrv *srv,  	struct tipc_subscription *sub;  	if (tipc_sub_read(s, filter) & TIPC_SUB_CANCEL) { +		s->filter &= __constant_ntohl(~TIPC_SUB_CANCEL);  		tipc_conn_delete_sub(con, s);  		return 0;  	} | 
