linux-sg2042/net
Tetsuo Handa 2a63866c8b tipc: fix shutdown() of connectionless socket
syzbot is reporting hung task at nbd_ioctl() [1], for there are two
problems regarding TIPC's connectionless socket's shutdown() operation.

----------
#include <fcntl.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/nbd.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
        const int fd = open("/dev/nbd0", 3);
        alarm(5);
        ioctl(fd, NBD_SET_SOCK, socket(PF_TIPC, SOCK_DGRAM, 0));
        ioctl(fd, NBD_DO_IT, 0); /* To be interrupted by SIGALRM. */
        return 0;
}
----------

One problem is that wait_for_completion() from flush_workqueue() from
nbd_start_device_ioctl() from nbd_ioctl() cannot be completed when
nbd_start_device_ioctl() received a signal at wait_event_interruptible(),
for tipc_shutdown() from kernel_sock_shutdown(SHUT_RDWR) from
nbd_mark_nsock_dead() from sock_shutdown() from nbd_start_device_ioctl()
is failing to wake up a WQ thread sleeping at wait_woken() from
tipc_wait_for_rcvmsg() from sock_recvmsg() from sock_xmit() from
nbd_read_stat() from recv_work() scheduled by nbd_start_device() from
nbd_start_device_ioctl(). Fix this problem by always invoking
sk->sk_state_change() (like inet_shutdown() does) when tipc_shutdown() is
called.

The other problem is that tipc_wait_for_rcvmsg() cannot return when
tipc_shutdown() is called, for tipc_shutdown() sets sk->sk_shutdown to
SEND_SHUTDOWN (despite "how" is SHUT_RDWR) while tipc_wait_for_rcvmsg()
needs sk->sk_shutdown set to RCV_SHUTDOWN or SHUTDOWN_MASK. Fix this
problem by setting sk->sk_shutdown to SHUTDOWN_MASK (like inet_shutdown()
does) when the socket is connectionless.

[1] https://syzkaller.appspot.com/bug?id=3fe51d307c1f0a845485cf1798aa059d12bf18b2

Reported-by: syzbot <syzbot+e36f41d207137b5d12f7@syzkaller.appspotmail.com>
Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Signed-off-by: David S. Miller <davem@davemloft.net>
2020-09-02 15:49:30 -07:00
..
6lowpan
9p
802
8021q
appletalk
atm
ax25
batman-adv
bluetooth
bpf
bpfilter
bridge
caif
can
ceph
core pktgen: fix error message with wrong function name 2020-09-01 11:44:53 -07:00
dcb
dccp
decnet
dns_resolver
dsa
ethernet
ethtool
hsr
ieee802154
ife
ipv4 netfilter: delete repeated words 2020-08-28 20:11:38 +02:00
ipv6 ipv6: Fix sysctl max for fib_multipath_hash_policy 2020-09-02 15:44:53 -07:00
iucv
kcm
key
l2tp
l3mdev net: Fix some comments 2020-08-27 07:55:59 -07:00
lapb
llc
mac80211 mac80211: reduce packet loss event false positives 2020-08-27 10:53:20 +02:00
mac802154
mpls
mptcp
ncsi
netfilter netfilter: conntrack: do not auto-delete clash entries on reply 2020-08-29 13:03:06 +02:00
netlabel
netlink netlink: fix a data race in netlink_rcv_wake() 2020-08-28 06:51:11 -07:00
netrom
nfc
nsh
openvswitch
packet
phonet
psample
qrtr
rds
rfkill
rose
rxrpc rxrpc: Fix memory leak in rxkad_verify_response() 2020-08-27 12:59:45 -07:00
sched net_sched: fix error path in red_init() 2020-08-28 07:16:46 -07:00
sctp
smc
strparser
sunrpc
switchdev
tipc tipc: fix shutdown() of connectionless socket 2020-09-02 15:49:30 -07:00
tls
unix
vmw_vsock
wimax
wireless cfg80211: Adjust 6 GHz frequency to channel conversion 2020-08-27 10:53:21 +02:00
x25
xdp
xfrm
Kconfig
Makefile
compat.c
devres.c
socket.c net: Fix some comments 2020-08-27 07:55:59 -07:00
sysctl_net.c