OrangePi_CM5/include/net
Hawkins Jiawei 61cc798591 net: fix refcount bug in sk_psock_get (2)
commit 2a0133723f9ebeb751cfce19f74ec07e108bef1f upstream.

Syzkaller reports refcount bug as follows:
------------[ cut here ]------------
refcount_t: saturated; leaking memory.
WARNING: CPU: 1 PID: 3605 at lib/refcount.c:19 refcount_warn_saturate+0xf4/0x1e0 lib/refcount.c:19
Modules linked in:
CPU: 1 PID: 3605 Comm: syz-executor208 Not tainted 5.18.0-syzkaller-03023-g7e062cda7d90 #0
 <TASK>
 __refcount_add_not_zero include/linux/refcount.h:163 [inline]
 __refcount_inc_not_zero include/linux/refcount.h:227 [inline]
 refcount_inc_not_zero include/linux/refcount.h:245 [inline]
 sk_psock_get+0x3bc/0x410 include/linux/skmsg.h:439
 tls_data_ready+0x6d/0x1b0 net/tls/tls_sw.c:2091
 tcp_data_ready+0x106/0x520 net/ipv4/tcp_input.c:4983
 tcp_data_queue+0x25f2/0x4c90 net/ipv4/tcp_input.c:5057
 tcp_rcv_state_process+0x1774/0x4e80 net/ipv4/tcp_input.c:6659
 tcp_v4_do_rcv+0x339/0x980 net/ipv4/tcp_ipv4.c:1682
 sk_backlog_rcv include/net/sock.h:1061 [inline]
 __release_sock+0x134/0x3b0 net/core/sock.c:2849
 release_sock+0x54/0x1b0 net/core/sock.c:3404
 inet_shutdown+0x1e0/0x430 net/ipv4/af_inet.c:909
 __sys_shutdown_sock net/socket.c:2331 [inline]
 __sys_shutdown_sock net/socket.c:2325 [inline]
 __sys_shutdown+0xf1/0x1b0 net/socket.c:2343
 __do_sys_shutdown net/socket.c:2351 [inline]
 __se_sys_shutdown net/socket.c:2349 [inline]
 __x64_sys_shutdown+0x50/0x70 net/socket.c:2349
 do_syscall_x64 arch/x86/entry/common.c:50 [inline]
 do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80
 entry_SYSCALL_64_after_hwframe+0x46/0xb0
 </TASK>

During SMC fallback process in connect syscall, kernel will
replaces TCP with SMC. In order to forward wakeup
smc socket waitqueue after fallback, kernel will sets
clcsk->sk_user_data to origin smc socket in
smc_fback_replace_callbacks().

Later, in shutdown syscall, kernel will calls
sk_psock_get(), which treats the clcsk->sk_user_data
as psock type, triggering the refcnt warning.

So, the root cause is that smc and psock, both will use
sk_user_data field. So they will mismatch this field
easily.

This patch solves it by using another bit(defined as
SK_USER_DATA_PSOCK) in PTRMASK, to mark whether
sk_user_data points to a psock object or not.
This patch depends on a PTRMASK introduced in commit f1ff5ce2cd
("net, sk_msg: Clear sk_user_data pointer on clone if tagged").

For there will possibly be more flags in the sk_user_data field,
this patch also refactor sk_user_data flags code to be more generic
to improve its maintainability.

Reported-and-tested-by: syzbot+5f26f85569bd179c18ce@syzkaller.appspotmail.com
Suggested-by: Jakub Kicinski <kuba@kernel.org>
Acked-by: Wen Gu <guwen@linux.alibaba.com>
Signed-off-by: Hawkins Jiawei <yin31149@gmail.com>
Reviewed-by: Jakub Sitnicki <jakub@cloudflare.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2022-09-05 10:28:56 +02:00
..
9p
…
bluetooth Bluetooth: L2CAP: Fix use-after-free caused by l2cap_chan_put 2022-08-03 12:00:43 +02:00
caif net: caif: add proper error handling 2021-06-10 13:39:24 +02:00
iucv
…
netfilter netfilter: nf_tables: disallow jump to implicit chain from set element 2022-08-31 17:15:18 +02:00
netns xfrm: rework default policy structure 2022-05-25 09:17:58 +02:00
nfc NFC: add NCI_UNREG flag to eliminate the race 2021-11-26 10:39:18 +01:00
phonet
…
sctp sctp: use call_rcu to free endpoint 2022-01-05 12:40:30 +01:00
tc_act net/sched: act_pedit: really ensure the skb is writable 2022-05-18 10:23:44 +02:00
6lowpan.h
…
Space.h
…
act_api.h net: sched: fix err handler in tcf_action_init() 2021-04-14 08:42:05 +02:00
addrconf.h ipv6/addrconf: fix a null-ptr-deref bug for ip6_ptr 2022-08-03 12:00:46 +02:00
af_ieee802154.h
…
af_rxrpc.h
…
af_unix.h
…
af_vsock.h vsock: each transport cycles only on its own sockets 2022-03-23 09:13:27 +01:00
ah.h
…
arp.h ipv4: Invalidate neighbour for broadcast address upon address addition 2022-04-13 21:00:57 +02:00
atmclip.h
…
ax25.h ax25: fix reference count leaks of ax25_dev 2022-04-20 09:23:31 +02:00
ax88796.h
…
bareudp.h
…
bond_3ad.h bonding: fix data-races around agg_select_timer 2022-02-23 12:01:02 +01:00
bond_alb.h bonding: make tx_rebalance_counter an atomic 2021-12-14 11:32:36 +01:00
bond_options.h
…
bonding.h bonding: Add struct bond_ipesc to manage SA 2021-07-28 14:35:33 +02:00
bpf_sk_storage.h
…
busy_poll.h net: Fix a data-race around sysctl_net_busy_poll. 2022-08-31 17:15:20 +02:00
calipso.h
…
cfg80211-wext.h
…
cfg80211.h cfg80211: fix management registrations locking 2021-11-02 19:48:20 +01:00
cfg802154.h
…
checksum.h net: Force inlining of checksum functions in net/checksum.h 2022-03-02 11:42:50 +01:00
cipso_ipv4.h
…
cls_cgroup.h
…
codel.h
…
codel_impl.h
…
codel_qdisc.h
…
compat.h
…
datalink.h
…
dcbevent.h
…
dcbnl.h
…
devlink.h
…
dn.h
…
dn_dev.h
…
dn_fib.h
…
dn_neigh.h
…
dn_nsp.h
…
dn_route.h
…
dsa.h
…
dsfield.h
…
dst.h net: Consolidate common blackhole dst ops 2021-03-30 14:32:05 +02:00
dst_cache.h wireguard: device: reset peer src endpoint when netns exits 2021-12-08 09:03:22 +01:00
dst_metadata.h net: fix a memleak when uncloning an skb dst and its metadata 2022-02-16 12:54:26 +01:00
dst_ops.h
…
erspan.h
…
esp.h esp: limit skb_page_frag_refill use to a single page 2022-04-27 13:53:48 +02:00
espintcp.h
…
ethoc.h
…
failover.h
…
fib_notifier.h
…
fib_rules.h ipv6: fix memory leak in fib6_rule_suppress 2021-12-08 09:03:21 +01:00
firewire.h
…
flow.h lsm,selinux: pass flowi_common instead of flowi to the LSM hooks 2022-06-09 10:21:09 +02:00
flow_dissector.h net/sched: flower: fix parsing of ethertype following VLAN header 2022-04-20 09:23:11 +02:00
flow_offload.h netfilter: nf_tables: bail out early if hardware offload is not supported 2022-06-14 18:32:40 +02:00
fou.h
…
fq.h
…
fq_impl.h
…
garp.h
…
gen_stats.h
…
genetlink.h
…
geneve.h
…
gre.h
…
gro_cells.h
…
gtp.h
…
gue.h
…
hwbm.h
…
icmp.h net: icmp: pass zeroed opts from icmp{,v6}_ndo_send before sending 2021-03-04 11:38:46 +01:00
ieee80211_radiotap.h
…
ieee802154_netdev.h
…
if_inet6.h ipv6: fix locking issues with loops over idev->addr_list 2022-06-09 10:20:50 +02:00
ife.h
…
ila.h
…
inet6_connection_sock.h
…
inet6_hashtables.h net: allow unbound socket for packets in VRF when tcp_l3mdev_accept set 2022-08-21 15:15:51 +02:00
inet_common.h
…
inet_connection_sock.h Revert "tcp: change pingpong threshold to 3" 2022-08-03 12:00:45 +02:00
inet_ecn.h
…
inet_frag.h inet: frags: annotate races around fqdir->dead and fqdir->high_thresh 2022-01-27 10:54:33 +01:00
inet_hashtables.h net: allow unbound socket for packets in VRF when tcp_l3mdev_accept set 2022-08-21 15:15:51 +02:00
inet_sock.h net: allow unbound socket for packets in VRF when tcp_l3mdev_accept set 2022-08-21 15:15:51 +02:00
inet_timewait_sock.h
…
inetpeer.h
…
ip.h ip: Fix data-races around sysctl_ip_prot_sock. 2022-07-29 17:19:20 +02:00
ip6_checksum.h
…
ip6_fib.h ipv6: annotate accesses to fn->fn_sernum 2022-02-01 17:25:44 +01:00
ip6_route.h net: ipv6: fix returned variable type in ip6_skb_dst_mtu 2021-08-12 13:22:07 +02:00
ip6_tunnel.h ip_gre, ip6_gre: Fix race condition on o_seqno in collect_md mode 2022-05-09 09:05:04 +02:00
ip_fib.h ipv4: convert fib_num_tclassid_users to atomic_t 2021-12-08 09:03:26 +01:00
ip_tunnels.h ip_gre, ip6_gre: Fix race condition on o_seqno in collect_md mode 2022-05-09 09:05:04 +02:00
ip_vs.h
…
ipcomp.h
…
ipconfig.h
…
ipv6.h ipv6: per-netns exclusive flowlabel checks 2022-02-23 12:01:01 +01:00
ipv6_frag.h inet: frags: annotate races around fqdir->dead and fqdir->high_thresh 2022-01-27 10:54:33 +01:00
ipv6_stubs.h net: ipv6: add fib6_nh_release_dsts stub 2021-12-01 09:19:05 +01:00
ipx.h
…
iw_handler.h
…
kcm.h
…
l3mdev.h
…
lag.h
…
lapb.h
…
lib80211.h
…
llc.h llc: fix out-of-bound array index in llc_sk_dev_hash() 2021-11-18 14:04:27 +01:00
llc_c_ac.h
…
llc_c_ev.h
…
llc_c_st.h
…
llc_conn.h
…
llc_if.h
…
llc_pdu.h net: llc: fix skb_over_panic 2021-08-04 12:46:43 +02:00
llc_s_ac.h
…
llc_s_ev.h
…
llc_s_st.h
…
llc_sap.h
…
lwtunnel.h
…
mac80211.h mac80211: Fix NULL ptr deref for injected rate info 2021-06-23 14:42:52 +02:00
mac802154.h
…
macsec.h net: macsec: fix the length used to copy the key for offloading 2021-07-14 16:56:28 +02:00
mip6.h
…
mld.h
…
mpls.h
…
mpls_iptunnel.h
…
mptcp.h
…
mrp.h
…
ncsi.h
…
ndisc.h
…
neighbour.h net, neigh: Enable state migration between NUD_PERMANENT and NTF_USE 2021-11-18 14:04:29 +01:00
net_failover.h
…
net_namespace.h net: make get_net_ns return error if NET_NS is disabled 2021-06-23 14:42:44 +02:00
net_ratelimit.h
…
netevent.h
…
netlabel.h
…
netlink.h
…
netprio_cgroup.h
…
netrom.h
…
nexthop.h net: ipv4: Fix rtnexthop len when RTA_FLOW is present 2021-10-06 15:55:53 +02:00
nl802154.h net: ieee802154: handle iftypes as u32 2021-12-01 09:19:03 +01:00
nsh.h
…
p8022.h
…
page_pool.h mm: fix struct page layout on 32-bit systems 2021-05-19 10:13:17 +02:00
pie.h
…
ping.h
…
pkt_cls.h net: zero-initialize tc skb extension on allocation 2021-06-03 09:00:51 +02:00
pkt_sched.h net: prevent user from passing illegal stab size 2021-10-17 10:43:33 +02:00
pptp.h
…
protocol.h
…
psample.h psample: Add a fwd declaration for skbuff 2021-08-18 08:59:11 +02:00
psnap.h
…
raw.h raw: Fix a data-race around sysctl_raw_l3mdev_accept. 2022-07-21 21:20:10 +02:00
rawv6.h
…
red.h sch_red: fix off-by-one checks in red_check_params() 2021-04-14 08:42:07 +02:00
regulatory.h
…
request_sock.h
…
rose.h
…
route.h lsm,selinux: pass flowi_common instead of flowi to the LSM hooks 2022-06-09 10:21:09 +02:00
rpl.h
…
rsi_91x.h
…
rtnetlink.h can: dev: Move device back to init netns on owning netns delete 2021-03-30 14:32:08 +02:00
rtnh.h
…
sch_generic.h net: sched: add barrier to fix packet stuck problem for lockless qdisc 2022-06-14 18:32:36 +02:00
scm.h
…
secure_seq.h secure_seq: use the 64 bits of the siphash for port offset calculation 2022-05-30 09:33:23 +02:00
seg6.h
…
seg6_hmac.h
…
seg6_local.h
…
slhc_vj.h
…
smc.h
…
snmp.h
…
sock.h net: fix refcount bug in sk_psock_get (2) 2022-09-05 10:28:56 +02:00
sock_reuseport.h
…
stp.h
…
strparser.h bpf: sockmap, strparser, and tls are reusing qdisc_skb_cb and colliding 2021-11-18 14:04:27 +01:00
switchdev.h switchdev: mrp: Remove SWITCHDEV_ATTR_ID_MRP_PORT_STAT 2021-02-17 11:02:29 +01:00
tcp.h tcp: Fix a data-race around sysctl_tcp_adv_win_scale. 2022-08-03 12:00:44 +02:00
tcp_states.h
…
timewait_sock.h
…
tipc.h
…
tls.h net/tls: Check for errors in tls_device_init 2022-07-21 21:20:13 +02:00
tls_toe.h
…
transp_v6.h
…
tso.h
…
tun_proto.h
…
udp.h udp: Fix a data-race around sysctl_udp_l3mdev_accept. 2022-07-29 17:19:21 +02:00
udp_tunnel.h udp: call udp_encap_enable for v6 sockets when enabling encap 2022-04-08 14:39:54 +02:00
udplite.h
…
vsock_addr.h
…
vxlan.h
…
wext.h
…
wimax.h
…
x25.h
…
x25device.h
…
xdp.h
…
xdp_priv.h
…
xdp_sock.h
…
xdp_sock_drv.h
…
xfrm.h xfrm: fix "disable_policy" flag use when arriving from different devices 2022-05-25 09:17:58 +02:00
xsk_buff_pool.h xsk: Fix missing validation for skb and unaligned mode 2021-07-14 16:56:23 +02:00