diff options
Diffstat (limited to 'net/tipc/msg.c')
-rw-r--r-- | net/tipc/msg.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/net/tipc/msg.c b/net/tipc/msg.c index 0c6dad8180a0..3bb499c61918 100644 --- a/net/tipc/msg.c +++ b/net/tipc/msg.c | |||
@@ -511,15 +511,18 @@ bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb, | |||
511 | { | 511 | { |
512 | struct tipc_msg *msg = buf_msg(skb); | 512 | struct tipc_msg *msg = buf_msg(skb); |
513 | u32 dport; | 513 | u32 dport; |
514 | u32 own_addr = tipc_own_addr(net); | ||
514 | 515 | ||
515 | if (!msg_isdata(msg)) | 516 | if (!msg_isdata(msg)) |
516 | return false; | 517 | return false; |
517 | if (!msg_named(msg)) | 518 | if (!msg_named(msg)) |
518 | return false; | 519 | return false; |
520 | if (msg_errcode(msg)) | ||
521 | return false; | ||
519 | *err = -TIPC_ERR_NO_NAME; | 522 | *err = -TIPC_ERR_NO_NAME; |
520 | if (skb_linearize(skb)) | 523 | if (skb_linearize(skb)) |
521 | return false; | 524 | return false; |
522 | if (msg_reroute_cnt(msg) > 0) | 525 | if (msg_reroute_cnt(msg)) |
523 | return false; | 526 | return false; |
524 | *dnode = addr_domain(net, msg_lookup_scope(msg)); | 527 | *dnode = addr_domain(net, msg_lookup_scope(msg)); |
525 | dport = tipc_nametbl_translate(net, msg_nametype(msg), | 528 | dport = tipc_nametbl_translate(net, msg_nametype(msg), |
@@ -527,6 +530,8 @@ bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb, | |||
527 | if (!dport) | 530 | if (!dport) |
528 | return false; | 531 | return false; |
529 | msg_incr_reroute_cnt(msg); | 532 | msg_incr_reroute_cnt(msg); |
533 | if (*dnode != own_addr) | ||
534 | msg_set_prevnode(msg, own_addr); | ||
530 | msg_set_destnode(msg, *dnode); | 535 | msg_set_destnode(msg, *dnode); |
531 | msg_set_destport(msg, dport); | 536 | msg_set_destport(msg, dport); |
532 | *err = TIPC_OK; | 537 | *err = TIPC_OK; |