diff options
Diffstat (limited to 'net/tipc')
| -rw-r--r-- | net/tipc/crypto.c | 2 | ||||
| -rw-r--r-- | net/tipc/link.c | 9 | ||||
| -rw-r--r-- | net/tipc/monitor.c | 2 | ||||
| -rw-r--r-- | net/tipc/name_distr.c | 2 | ||||
| -rw-r--r-- | net/tipc/name_table.c | 2 | ||||
| -rw-r--r-- | net/tipc/node.c | 13 | ||||
| -rw-r--r-- | net/tipc/socket.c | 2 | 
7 files changed, 20 insertions, 12 deletions
| diff --git a/net/tipc/crypto.c b/net/tipc/crypto.c index 9325479295b8..f09316a9035f 100644 --- a/net/tipc/crypto.c +++ b/net/tipc/crypto.c @@ -2276,7 +2276,7 @@ static bool tipc_crypto_key_rcv(struct tipc_crypto *rx, struct tipc_msg *hdr)  	struct tipc_crypto *tx = tipc_net(rx->net)->crypto_tx;  	struct tipc_aead_key *skey = NULL;  	u16 key_gen = msg_key_gen(hdr); -	u16 size = msg_data_sz(hdr); +	u32 size = msg_data_sz(hdr);  	u8 *data = msg_data(hdr);  	unsigned int keylen; diff --git a/net/tipc/link.c b/net/tipc/link.c index 8d9e09f48f4c..1e14d7f8f28f 100644 --- a/net/tipc/link.c +++ b/net/tipc/link.c @@ -2200,7 +2200,7 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb,  	struct tipc_msg *hdr = buf_msg(skb);  	struct tipc_gap_ack_blks *ga = NULL;  	bool reply = msg_probe(hdr), retransmitted = false; -	u16 dlen = msg_data_sz(hdr), glen = 0; +	u32 dlen = msg_data_sz(hdr), glen = 0;  	u16 peers_snd_nxt =  msg_next_sent(hdr);  	u16 peers_tol = msg_link_tolerance(hdr);  	u16 peers_prio = msg_linkprio(hdr); @@ -2214,6 +2214,10 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb,  	void *data;  	trace_tipc_proto_rcv(skb, false, l->name); + +	if (dlen > U16_MAX) +		goto exit; +  	if (tipc_link_is_blocked(l) || !xmitq)  		goto exit; @@ -2309,7 +2313,8 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb,  		/* Receive Gap ACK blocks from peer if any */  		glen = tipc_get_gap_ack_blks(&ga, l, hdr, true); - +		if(glen > dlen) +			break;  		tipc_mon_rcv(l->net, data + glen, dlen - glen, l->addr,  			     &l->mon_state, l->bearer_id); diff --git a/net/tipc/monitor.c b/net/tipc/monitor.c index 407619697292..2f4d23238a7e 100644 --- a/net/tipc/monitor.c +++ b/net/tipc/monitor.c @@ -496,6 +496,8 @@ void tipc_mon_rcv(struct net *net, void *data, u16 dlen, u32 addr,  	state->probing = false;  	/* Sanity check received domain record */ +	if (new_member_cnt > MAX_MON_DOMAIN) +		return;  	if (dlen < dom_rec_len(arrv_dom, 0))  		return;  	if (dlen != dom_rec_len(arrv_dom, new_member_cnt)) diff --git a/net/tipc/name_distr.c b/net/tipc/name_distr.c index bda902caa814..8267b751a526 100644 --- a/net/tipc/name_distr.c +++ b/net/tipc/name_distr.c @@ -313,7 +313,7 @@ static bool tipc_update_nametbl(struct net *net, struct distr_item *i,  		pr_warn_ratelimited("Failed to remove binding %u,%u from %u\n",  				    ua.sr.type, ua.sr.lower, node);  	} else { -		pr_warn("Unrecognized name table message received\n"); +		pr_warn_ratelimited("Unknown name table message received\n");  	}  	return false;  } diff --git a/net/tipc/name_table.c b/net/tipc/name_table.c index 01396dd1c899..1d8ba233d047 100644 --- a/net/tipc/name_table.c +++ b/net/tipc/name_table.c @@ -967,7 +967,7 @@ static int __tipc_nl_add_nametable_publ(struct tipc_nl_msg *msg,  		list_for_each_entry(p, &sr->all_publ, all_publ)  			if (p->key == *last_key)  				break; -		if (p->key != *last_key) +		if (list_entry_is_head(p, &sr->all_publ, all_publ))  			return -EPIPE;  	} else {  		p = list_first_entry(&sr->all_publ, diff --git a/net/tipc/node.c b/net/tipc/node.c index 9947b7dfe1d2..6ef95ce565bd 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c @@ -403,7 +403,7 @@ static void tipc_node_write_unlock(struct tipc_node *n)  	u32 flags = n->action_flags;  	struct list_head *publ_list;  	struct tipc_uaddr ua; -	u32 bearer_id; +	u32 bearer_id, node;  	if (likely(!flags)) {  		write_unlock_bh(&n->lock); @@ -413,7 +413,8 @@ static void tipc_node_write_unlock(struct tipc_node *n)  	tipc_uaddr(&ua, TIPC_SERVICE_RANGE, TIPC_NODE_SCOPE,  		   TIPC_LINK_STATE, n->addr, n->addr);  	sk.ref = n->link_id; -	sk.node = n->addr; +	sk.node = tipc_own_addr(net); +	node = n->addr;  	bearer_id = n->link_id & 0xffff;  	publ_list = &n->publ_list; @@ -423,17 +424,17 @@ static void tipc_node_write_unlock(struct tipc_node *n)  	write_unlock_bh(&n->lock);  	if (flags & TIPC_NOTIFY_NODE_DOWN) -		tipc_publ_notify(net, publ_list, sk.node, n->capabilities); +		tipc_publ_notify(net, publ_list, node, n->capabilities);  	if (flags & TIPC_NOTIFY_NODE_UP) -		tipc_named_node_up(net, sk.node, n->capabilities); +		tipc_named_node_up(net, node, n->capabilities);  	if (flags & TIPC_NOTIFY_LINK_UP) { -		tipc_mon_peer_up(net, sk.node, bearer_id); +		tipc_mon_peer_up(net, node, bearer_id);  		tipc_nametbl_publish(net, &ua, &sk, sk.ref);  	}  	if (flags & TIPC_NOTIFY_LINK_DOWN) { -		tipc_mon_peer_down(net, sk.node, bearer_id); +		tipc_mon_peer_down(net, node, bearer_id);  		tipc_nametbl_withdraw(net, &ua, &sk, sk.ref);  	}  } diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 3e63c83e641c..7545321c3440 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -3749,7 +3749,7 @@ static int __tipc_nl_list_sk_publ(struct sk_buff *skb,  			if (p->key == *last_publ)  				break;  		} -		if (p->key != *last_publ) { +		if (list_entry_is_head(p, &tsk->publications, binding_sock)) {  			/* We never set seq or call nl_dump_check_consistent()  			 * this means that setting prev_seq here will cause the  			 * consistence check to fail in the netlink callback |