All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Rao Shoaib <rao.shoaib@oracle.com>,
	"David S . Miller" <davem@davemloft.net>,
	Sasha Levin <sashal@kernel.org>,
	netdev@vger.kernel.org, linux-rdma@vger.kernel.org,
	rds-devel@oss.oracle.com
Subject: [PATCH AUTOSEL 5.12 25/43] RDS tcp loopback connection can hang
Date: Thu,  3 Jun 2021 13:07:15 -0400	[thread overview]
Message-ID: <20210603170734.3168284-25-sashal@kernel.org> (raw)
In-Reply-To: <20210603170734.3168284-1-sashal@kernel.org>

From: Rao Shoaib <rao.shoaib@oracle.com>

[ Upstream commit aced3ce57cd37b5ca332bcacd370d01f5a8c5371 ]

When TCP is used as transport and a program on the
system connects to RDS port 16385, connection is
accepted but denied per the rules of RDS. However,
RDS connections object is left in the list. Next
loopback connection will select that connection
object as it is at the head of list. The connection
attempt will hang as the connection object is set
to connect over TCP which is not allowed

The issue can be reproduced easily, use rds-ping
to ping a local IP address. After that use any
program like ncat to connect to the same IP
address and port 16385. This will hang so ctrl-c out.
Now try rds-ping, it will hang.

To fix the issue this patch adds checks to disallow
the connection object creation and destroys the
connection object.

Signed-off-by: Rao Shoaib <rao.shoaib@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 net/rds/connection.c | 23 +++++++++++++++++------
 net/rds/tcp.c        |  4 ++--
 net/rds/tcp.h        |  3 ++-
 net/rds/tcp_listen.c |  6 ++++++
 4 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/net/rds/connection.c b/net/rds/connection.c
index f2fcab182095..a3bc4b54d491 100644
--- a/net/rds/connection.c
+++ b/net/rds/connection.c
@@ -240,12 +240,23 @@ static struct rds_connection *__rds_conn_create(struct net *net,
 	if (loop_trans) {
 		rds_trans_put(loop_trans);
 		conn->c_loopback = 1;
-		if (is_outgoing && trans->t_prefer_loopback) {
-			/* "outgoing" connection - and the transport
-			 * says it wants the connection handled by the
-			 * loopback transport. This is what TCP does.
-			 */
-			trans = &rds_loop_transport;
+		if (trans->t_prefer_loopback) {
+			if (likely(is_outgoing)) {
+				/* "outgoing" connection to local address.
+				 * Protocol says it wants the connection
+				 * handled by the loopback transport.
+				 * This is what TCP does.
+				 */
+				trans = &rds_loop_transport;
+			} else {
+				/* No transport currently in use
+				 * should end up here, but if it
+				 * does, reset/destroy the connection.
+				 */
+				kmem_cache_free(rds_conn_slab, conn);
+				conn = ERR_PTR(-EOPNOTSUPP);
+				goto out;
+			}
 		}
 	}
 
diff --git a/net/rds/tcp.c b/net/rds/tcp.c
index 43db0eca911f..abf19c0e3ba0 100644
--- a/net/rds/tcp.c
+++ b/net/rds/tcp.c
@@ -313,8 +313,8 @@ static void rds6_tcp_tc_info(struct socket *sock, unsigned int len,
 }
 #endif
 
-static int rds_tcp_laddr_check(struct net *net, const struct in6_addr *addr,
-			       __u32 scope_id)
+int rds_tcp_laddr_check(struct net *net, const struct in6_addr *addr,
+			__u32 scope_id)
 {
 	struct net_device *dev = NULL;
 #if IS_ENABLED(CONFIG_IPV6)
diff --git a/net/rds/tcp.h b/net/rds/tcp.h
index bad9cf49d565..dc8d745d6857 100644
--- a/net/rds/tcp.h
+++ b/net/rds/tcp.h
@@ -59,7 +59,8 @@ u32 rds_tcp_snd_una(struct rds_tcp_connection *tc);
 u64 rds_tcp_map_seq(struct rds_tcp_connection *tc, u32 seq);
 extern struct rds_transport rds_tcp_transport;
 void rds_tcp_accept_work(struct sock *sk);
-
+int rds_tcp_laddr_check(struct net *net, const struct in6_addr *addr,
+			__u32 scope_id);
 /* tcp_connect.c */
 int rds_tcp_conn_path_connect(struct rds_conn_path *cp);
 void rds_tcp_conn_path_shutdown(struct rds_conn_path *conn);
diff --git a/net/rds/tcp_listen.c b/net/rds/tcp_listen.c
index 101cf14215a0..09cadd556d1e 100644
--- a/net/rds/tcp_listen.c
+++ b/net/rds/tcp_listen.c
@@ -167,6 +167,12 @@ int rds_tcp_accept_one(struct socket *sock)
 	}
 #endif
 
+	if (!rds_tcp_laddr_check(sock_net(sock->sk), peer_addr, dev_if)) {
+		/* local address connection is only allowed via loopback */
+		ret = -EOPNOTSUPP;
+		goto out;
+	}
+
 	conn = rds_conn_create(sock_net(sock->sk),
 			       my_addr, peer_addr,
 			       &rds_tcp_transport, 0, GFP_KERNEL, dev_if);
-- 
2.30.2


  parent reply	other threads:[~2021-06-03 17:08 UTC|newest]

Thread overview: 70+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-03 17:06 [PATCH AUTOSEL 5.12 01/43] ASoC: max98088: fix ni clock divider calculation Sasha Levin
2021-06-03 17:06 ` Sasha Levin
2021-06-03 17:06 ` [PATCH AUTOSEL 5.12 02/43] ASoC: amd: fix for pcm_read() error Sasha Levin
2021-06-03 17:06   ` Sasha Levin
2021-06-03 17:06 ` [PATCH AUTOSEL 5.12 03/43] spi: Fix spi device unregister flow Sasha Levin
2021-06-06 11:10   ` Lukas Wunner
2021-06-10 17:55     ` Sasha Levin
2021-06-10 19:22       ` Saravana Kannan
2021-06-10 19:26         ` Lukas Wunner
2021-06-10 19:30           ` Saravana Kannan
2021-06-10 22:29             ` Lukas Wunner
2021-06-10 23:01               ` Saravana Kannan
2021-06-03 17:06 ` [PATCH AUTOSEL 5.12 04/43] spi: spi-zynq-qspi: Fix stack violation bug Sasha Levin
2021-06-03 17:06   ` Sasha Levin
2021-06-03 17:06 ` [PATCH AUTOSEL 5.12 05/43] bpf: Forbid trampoline attach for functions with variable arguments Sasha Levin
2021-06-03 17:06 ` [PATCH AUTOSEL 5.12 06/43] ASoC: codecs: lpass-rx-macro: add missing MODULE_DEVICE_TABLE Sasha Levin
2021-06-03 17:06   ` Sasha Levin
2021-06-03 17:06 ` [PATCH AUTOSEL 5.12 07/43] ASoC: codecs: lpass-tx-macro: " Sasha Levin
2021-06-03 17:06   ` Sasha Levin
2021-06-03 17:06 ` [PATCH AUTOSEL 5.12 08/43] net/nfc/rawsock.c: fix a permission check bug Sasha Levin
2021-06-03 17:06 ` [PATCH AUTOSEL 5.12 09/43] usb: cdns3: Fix runtime PM imbalance on error Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 10/43] ASoC: Intel: bytcr_rt5640: Add quirk for the Glavey TM800A550L tablet Sasha Levin
2021-06-03 17:07   ` Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 11/43] ASoC: Intel: bytcr_rt5640: Add quirk for the Lenovo Miix 3-830 tablet Sasha Levin
2021-06-03 17:07   ` Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 12/43] bpf: Add deny list of btf ids check for tracing programs Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 13/43] vfio-ccw: Reset FSM state to IDLE inside FSM Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 14/43] vfio-ccw: Serialize FSM IDLE state with I/O completion Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 15/43] ASoC: sti-sas: add missing MODULE_DEVICE_TABLE Sasha Levin
2021-06-03 17:07   ` Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 16/43] spi: sprd: Add " Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 17/43] usb: chipidea: udc: assign interrupt number to USB gadget structure Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 18/43] isdn: mISDN: netjet: Fix crash in nj_probe: Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 19/43] bonding: init notify_work earlier to avoid uninitialized use Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 20/43] netlink: disable IRQs for netlink_lock_table() Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 21/43] net: mdiobus: get rid of a BUG_ON() Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 22/43] cgroup: disable controllers at parse time Sasha Levin
2021-06-03 17:07   ` Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 23/43] wq: handle VM suspension in stall detection Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 24/43] net/qla3xxx: fix schedule while atomic in ql_sem_spinlock Sasha Levin
2021-06-03 17:07 ` Sasha Levin [this message]
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 26/43] net:sfc: fix non-freed irq in legacy irq mode Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 27/43] scsi: bnx2fc: Return failure if io_req is already in ABTS processing Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 28/43] scsi: vmw_pvscsi: Set correct residual data length Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 29/43] scsi: hisi_sas: Drop free_irq() of devm_request_irq() allocated irq Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 30/43] scsi: target: qla2xxx: Wait for stop_phase1 at WWN removal Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 31/43] net: macb: ensure the device is available before accessing GEMGXL control registers Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 32/43] net: appletalk: cops: Fix data race in cops_probe1 Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 33/43] net: dsa: microchip: enable phy errata workaround on 9567 Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 34/43] Makefile: LTO: have linker check -Wframe-larger-than Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 35/43] nvme-fabrics: decode host pathing error for connect Sasha Levin
2021-06-03 17:07   ` Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 36/43] MIPS: Fix kernel hang under FUNCTION_GRAPH_TRACER and PREEMPT_TRACER Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 37/43] bpf, selftests: Adjust few selftest result_unpriv outcomes Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 38/43] dm verity: fix require_signatures module_param permissions Sasha Levin
2021-06-03 17:07   ` [dm-devel] " Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 39/43] bnx2x: Fix missing error code in bnx2x_iov_init_one() Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 40/43] nvme-tcp: remove incorrect Kconfig dep in BLK_DEV_NVME Sasha Levin
2021-06-03 17:07   ` Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 41/43] nvmet: fix false keep-alive timeout when a controller is torn down Sasha Levin
2021-06-03 17:07   ` Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 42/43] powerpc/fsl: set fsl,i2c-erratum-a004447 flag for P2041 i2c controllers Sasha Levin
2021-06-03 17:07   ` [PATCH AUTOSEL 5.12 42/43] powerpc/fsl: set fsl, i2c-erratum-a004447 " Sasha Levin
2021-06-04  0:42   ` [PATCH AUTOSEL 5.12 42/43] powerpc/fsl: set fsl,i2c-erratum-a004447 " Michael Ellerman
2021-06-04  0:42     ` Michael Ellerman
2021-06-04  0:58     ` Chris Packham
2021-06-10 22:00       ` Sasha Levin
2021-06-10 22:00         ` Sasha Levin
2021-06-03 17:07 ` [PATCH AUTOSEL 5.12 43/43] powerpc/fsl: set fsl,i2c-erratum-a004447 flag for P1010 " Sasha Levin
2021-06-03 17:07   ` [PATCH AUTOSEL 5.12 43/43] powerpc/fsl: set fsl, i2c-erratum-a004447 " Sasha Levin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210603170734.3168284-25-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=davem@davemloft.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-rdma@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=rao.shoaib@oracle.com \
    --cc=rds-devel@oss.oracle.com \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.