NBD requires a handshake, so passing unconnected or half-closed sockets to NBD does not make sense. Let's accept TCP_ESTABLISHED sockets only. Note that AF_UNIX sockets remain in TCP_ESTABLISHED once connect()ed regardless of shutdown(), but this is a prep patch for TCP, allowing a subsequent patch to call tcp_sendmsg_locked() directly without extra setup (e.g. inet_send_prepare()). Signed-off-by: Kuniyuki Iwashima --- drivers/block/nbd.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index fc714cba1f23..1877554d362e 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -1228,6 +1228,13 @@ static struct socket *nbd_get_socket(struct nbd_device *nbd, unsigned long fd, return NULL; } + if (READ_ONCE(sock->sk->sk_state) != TCP_ESTABLISHED) { + dev_err(disk_to_dev(nbd->disk), "Socket does not have bi-directional stream.\n"); + *err = -EPIPE; + sockfd_put(sock); + return NULL; + } + return sock; } -- 2.53.0.1018.g2bb0e51243-goog