diff options
Diffstat (limited to 'net/tipc/link.c')
| -rw-r--r-- | net/tipc/link.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/net/tipc/link.c b/net/tipc/link.c index daa6080a2a0c..a80feee5197a 100644 --- a/net/tipc/link.c +++ b/net/tipc/link.c | |||
| @@ -2306,8 +2306,11 @@ static int link_recv_changeover_msg(struct tipc_link **l_ptr, | |||
| 2306 | struct tipc_msg *tunnel_msg = buf_msg(tunnel_buf); | 2306 | struct tipc_msg *tunnel_msg = buf_msg(tunnel_buf); |
| 2307 | u32 msg_typ = msg_type(tunnel_msg); | 2307 | u32 msg_typ = msg_type(tunnel_msg); |
| 2308 | u32 msg_count = msg_msgcnt(tunnel_msg); | 2308 | u32 msg_count = msg_msgcnt(tunnel_msg); |
| 2309 | u32 bearer_id = msg_bearer_id(tunnel_msg); | ||
| 2309 | 2310 | ||
| 2310 | dest_link = (*l_ptr)->owner->links[msg_bearer_id(tunnel_msg)]; | 2311 | if (bearer_id >= MAX_BEARERS) |
| 2312 | goto exit; | ||
| 2313 | dest_link = (*l_ptr)->owner->links[bearer_id]; | ||
| 2311 | if (!dest_link) | 2314 | if (!dest_link) |
| 2312 | goto exit; | 2315 | goto exit; |
| 2313 | if (dest_link == *l_ptr) { | 2316 | if (dest_link == *l_ptr) { |
| @@ -2521,14 +2524,16 @@ int tipc_link_recv_fragment(struct sk_buff **pending, struct sk_buff **fb, | |||
| 2521 | struct tipc_msg *imsg = (struct tipc_msg *)msg_data(fragm); | 2524 | struct tipc_msg *imsg = (struct tipc_msg *)msg_data(fragm); |
| 2522 | u32 msg_sz = msg_size(imsg); | 2525 | u32 msg_sz = msg_size(imsg); |
| 2523 | u32 fragm_sz = msg_data_sz(fragm); | 2526 | u32 fragm_sz = msg_data_sz(fragm); |
| 2524 | u32 exp_fragm_cnt = msg_sz/fragm_sz + !!(msg_sz % fragm_sz); | 2527 | u32 exp_fragm_cnt; |
| 2525 | u32 max = TIPC_MAX_USER_MSG_SIZE + NAMED_H_SIZE; | 2528 | u32 max = TIPC_MAX_USER_MSG_SIZE + NAMED_H_SIZE; |
| 2529 | |||
| 2526 | if (msg_type(imsg) == TIPC_MCAST_MSG) | 2530 | if (msg_type(imsg) == TIPC_MCAST_MSG) |
| 2527 | max = TIPC_MAX_USER_MSG_SIZE + MCAST_H_SIZE; | 2531 | max = TIPC_MAX_USER_MSG_SIZE + MCAST_H_SIZE; |
| 2528 | if (msg_size(imsg) > max) { | 2532 | if (fragm_sz == 0 || msg_size(imsg) > max) { |
| 2529 | kfree_skb(fbuf); | 2533 | kfree_skb(fbuf); |
| 2530 | return 0; | 2534 | return 0; |
| 2531 | } | 2535 | } |
| 2536 | exp_fragm_cnt = msg_sz / fragm_sz + !!(msg_sz % fragm_sz); | ||
| 2532 | pbuf = tipc_buf_acquire(msg_size(imsg)); | 2537 | pbuf = tipc_buf_acquire(msg_size(imsg)); |
| 2533 | if (pbuf != NULL) { | 2538 | if (pbuf != NULL) { |
| 2534 | pbuf->next = *pending; | 2539 | pbuf->next = *pending; |
