linux-yocto/net/tipc
Xin Long 40dbfc0be2 tipc: use skb_unshare() instead in tipc_buf_append()
[ Upstream commit ff48b6222e ]

In tipc_buf_append() it may change skb's frag_list, and it causes
problems when this skb is cloned. skb_unclone() doesn't really
make this skb's flag_list available to change.

Shuang Li has reported an use-after-free issue because of this
when creating quite a few macvlan dev over the same dev, where
the broadcast packets will be cloned and go up to the stack:

 [ ] BUG: KASAN: use-after-free in pskb_expand_head+0x86d/0xea0
 [ ] Call Trace:
 [ ]  dump_stack+0x7c/0xb0
 [ ]  print_address_description.constprop.7+0x1a/0x220
 [ ]  kasan_report.cold.10+0x37/0x7c
 [ ]  check_memory_region+0x183/0x1e0
 [ ]  pskb_expand_head+0x86d/0xea0
 [ ]  process_backlog+0x1df/0x660
 [ ]  net_rx_action+0x3b4/0xc90
 [ ]
 [ ] Allocated by task 1786:
 [ ]  kmem_cache_alloc+0xbf/0x220
 [ ]  skb_clone+0x10a/0x300
 [ ]  macvlan_broadcast+0x2f6/0x590 [macvlan]
 [ ]  macvlan_process_broadcast+0x37c/0x516 [macvlan]
 [ ]  process_one_work+0x66a/0x1060
 [ ]  worker_thread+0x87/0xb10
 [ ]
 [ ] Freed by task 3253:
 [ ]  kmem_cache_free+0x82/0x2a0
 [ ]  skb_release_data+0x2c3/0x6e0
 [ ]  kfree_skb+0x78/0x1d0
 [ ]  tipc_recvmsg+0x3be/0xa40 [tipc]

So fix it by using skb_unshare() instead, which would create a new
skb for the cloned frag and it'll be safe to change its frag_list.
The similar things were also done in sctp_make_reassembled_event(),
which is using skb_copy().

Reported-by: Shuang Li <shuali@redhat.com>
Fixes: 37e22164a8 ("tipc: rename and move message reassembly function")
Signed-off-by: Xin Long <lucien.xin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2020-10-01 13:12:24 +02:00
..
addr.c
addr.h
bcast.c tipc: correct initialization of skb list 2017-10-08 21:13:23 -07:00
bcast.h tipc: make replicast a user selectable option 2017-01-20 12:10:17 -05:00
bearer.c tipc: error path leak fixes in tipc_enable_bearer() 2018-03-03 10:24:30 +01:00
bearer.h Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2017-09-01 17:42:05 -07:00
core.c tipc: fix ordering of tipc module init and exit routine 2019-12-21 10:47:35 +01:00
core.h netns: make struct pernet_operations::id unsigned int 2016-11-18 10:59:15 -05:00
discover.c tipc: allocate user memory with GFP_KERNEL flag 2017-01-16 13:31:53 -05:00
discover.h
eth_media.c
ib_media.c
Kconfig
link.c tipc: reduce risk of wakeup queue starvation 2020-01-27 14:46:41 +01:00
link.h tipc: transfer broadcast nacks in link state messages 2016-09-02 17:10:24 -07:00
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
monitor.c tipc: fix infinite loop when dumping link monitor summary 2018-06-21 04:02:43 +09:00
monitor.h
msg.c tipc: use skb_unshare() instead in tipc_buf_append() 2020-10-01 13:12:24 +02:00
msg.h tipc: introduce replicast as transport option for multicast 2017-01-20 12:10:17 -05:00
name_distr.c tipc: add NULL pointer check before calling kfree_rcu 2019-09-19 09:08:02 +02:00
name_distr.h
name_table.c tipc: adjust the policy of holding subscription kref 2017-03-28 18:03:33 -07:00
name_table.h tipc: add functionality to lookup multicast destination nodes 2017-01-20 12:10:16 -05:00
net.c netlink: pass extended ACK struct where available 2017-04-13 13:58:22 -04:00
net.h tipc: add peer removal functionality 2016-08-18 23:36:07 -07:00
netlink_compat.c tipc: fix uninit skb->data in tipc_nl_compat_dumpit() 2020-09-03 11:22:23 +02:00
netlink.c tipc: add policy for TIPC_NLA_NET_ADDR 2018-04-29 11:33:12 +02:00
netlink.h
node.c tipc: tipc clang warning 2020-01-27 14:46:27 +01:00
node.h tipc: make replicast a user selectable option 2017-01-20 12:10:17 -05:00
server.c tipc: fix memory leak in tipc_accept_from_sock() 2017-12-17 15:07:56 +01:00
server.h
socket.c tipc: fix shutdown() of connection oriented socket 2020-10-01 13:12:24 +02:00
socket.h
subscr.c tipc: fix modprobe tipc failed after switch order of device registration 2019-06-09 09:18:12 +02:00
subscr.h tipc: fix modprobe tipc failed after switch order of device registration 2019-06-09 09:18:12 +02:00
sysctl.c tipc: set sysctl_tipc_rmem and named_timeout right range 2020-01-27 14:46:29 +01:00
udp_media.c net: ipv6_stub: use ip6_dst_lookup_flow instead of ip6_dst_lookup 2020-05-20 08:17:02 +02:00
udp_media.h tipc: add UDP remoteip dump to netlink API 2016-08-26 21:38:41 -07:00