tipc: fix use-after-free in tipc_disc_rcv()

commit 31e4ccc99eda8a5a7e6902c98bee6e78ffd3edb9 upstream.

In the function 'tipc_disc_rcv()', the 'msg_peer_net_hash()' is called
to read the header data field but after the message skb has been freed,
that might result in a garbage value...

This commit fixes it by defining a new local variable to store the data
first, just like the other header fields' handling.

Fixes: f73b12812a3d ("tipc: improve throughput between nodes in netns")
Acked-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: Tuong Lien <tuong.t.lien@dektech.com.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Tuong Lien 2019-12-10 15:21:05 +07:00 committed by Greg Kroah-Hartman
parent 3eeb06132d
commit 3188f80b80

View File

@ -194,6 +194,7 @@ void tipc_disc_rcv(struct net *net, struct sk_buff *skb,
{ {
struct tipc_net *tn = tipc_net(net); struct tipc_net *tn = tipc_net(net);
struct tipc_msg *hdr = buf_msg(skb); struct tipc_msg *hdr = buf_msg(skb);
u32 pnet_hash = msg_peer_net_hash(hdr);
u16 caps = msg_node_capabilities(hdr); u16 caps = msg_node_capabilities(hdr);
bool legacy = tn->legacy_addr_format; bool legacy = tn->legacy_addr_format;
u32 sugg = msg_sugg_node_addr(hdr); u32 sugg = msg_sugg_node_addr(hdr);
@ -245,9 +246,8 @@ void tipc_disc_rcv(struct net *net, struct sk_buff *skb,
return; return;
if (!tipc_in_scope(legacy, b->domain, src)) if (!tipc_in_scope(legacy, b->domain, src))
return; return;
tipc_node_check_dest(net, src, peer_id, b, caps, signature, tipc_node_check_dest(net, src, peer_id, b, caps, signature, pnet_hash,
msg_peer_net_hash(hdr), &maddr, &respond, &maddr, &respond, &dupl_addr);
&dupl_addr);
if (dupl_addr) if (dupl_addr)
disc_dupl_alert(b, src, &maddr); disc_dupl_alert(b, src, &maddr);
if (!respond) if (!respond)