O2net: Disallow o2net accept connection request from itself.
PATCH 1/1 O2net: Disallow o2net accept connection request from itself.
Currently, o2net_accept_one() is allowed to accept a connection from listening node itself, such a fake connection will not be successfully established due to no handshake detected afterwards, and later end up with triggering connecting worker in a loop.
We're going to fix this by treating such connection request as 'invalid', since we've got no chance of requesting connection from a node to itself in a OCFS2 cluster.
The fix doesn't hurt user's scan for o2net-listener, it always gets a successful connection from userpace.
--- fs/ocfs2/cluster/tcp.c | 16 +++++++++++----- 1 files changed, 11 insertions(+), 5 deletions(-)
fs/ocfs2/cluster/tcp.c +11 -5
@@ -1759,6 +1759,7 @@ static int o2net_accept_one(struct socket *sock)struct sockaddr_in sin;struct socket *new_sock =NULL ;struct o2nm_node *node =NULL ; +struct o2nm_node *local_node =o2nm_get_node_by_num (o2nm_this_node ());struct o2net_sock_container *sc =NULL ;struct o2net_node *nn;
@@ -1796,11 +1797,14 @@ static int o2net_accept_one(struct socket *sock) goto out; } -if (o2nm_this_node () > node->nd_num) { -mlog (ML_NOTICE ,"unexpected connect attempted from a lower " -"numbered node '%s' at " "%pI4:%d with num %u\n" , - node->nd_name, &sin.sin_addr.s_addr, -ntohs (sin.sin_port), node->nd_num); +if (o2nm_this_node () >= node->nd_num) { +mlog (ML_NOTICE ,"unexpected connect attempt seen at node '%s' (" +"%u, %pI4:%d) from node '%s' (%u, %pI4:%d)\n" , + local_node->nd_name, local_node->nd_num, + &(local_node->nd_ipv4_address), +ntohs (local_node->nd_ipv4_port), + node->nd_name, node->nd_num, &sin.sin_addr.s_addr, +ntohs (sin.sin_port)); ret = -EINVAL ; goto out; }
@@ -1857,6 +1861,8 @@ out:sock_release (new_sock);if (node)o2nm_node_put (node); +if (local_node) +o2nm_node_put (local_node);if (sc)sc_put (sc);return ret;
Signature · 1 line
1.5.5
PATCH 1/1 O2net: Disallow o2net accept connection request from itself.
You can tighten it a little more. You can add my Acked-by to the next patch.
Quoted 22 lines · Tristan Ye
Currently,
o2net_accept_one()is allowed to accept a connection from listening node itself, such a fake connection will not be successfully established due to no handshake detected afterwards, and later end up with triggering connecting worker in a loop.We're going to fix this by treating such connection request as 'invalid', since we've got no chance of requesting connection from a node to itself in a OCFS2 cluster.
The fix doesn't hurt user's scan for o2net-listener, it always gets a successful connection from userpace.
Signed-off-by Tristan Ye<[email protected]>--- fs/ocfs2/cluster/tcp.c | 16 +++++++++++----- 1 files changed, 11 insertions(+), 5 deletions(-)fs/ocfs2/cluster/tcp.c +0
-0
fs/ocfs2/cluster/tcp.c static int o2net_accept_one(struct socket *sock) · line 1763
Quoted 5 lines
fs/ocfs2/cluster/tcp.c +1
-0@@ -1759,6 +1759,7 @@ static int o2net_accept_one(struct socket *sock)struct sockaddr_in sin;struct socket *new_sock =NULL ;struct o2nm_node *node =NULL ; +struct o2nm_node *local_node =o2nm_get_node_by_num (o2nm_this_node ());
+ struct o2nm_node *local_node = NULL;
Quoted 4 lines
fs/ocfs2/cluster/tcp.c +0
-0struct o2net_sock_container *sc =NULL ;struct o2net_node *nn;
fs/ocfs2/cluster/tcp.c static int o2net_accept_one(struct socket *sock) · line 1801
Quoted 10 lines
fs/ocfs2/cluster/tcp.c +1
-5@@ -1796,11 +1797,14 @@ static int o2net_accept_one(struct socket *sock) goto out; } -if (o2nm_this_node ()> node->nd_num) { -mlog (ML_NOTICE ,"unexpected connect attempted from a lower " -"numbered node '%s' at " "%pI4:%d with num %u\n" , - node->nd_name,&sin.sin_addr.s_addr, -ntohs (sin.sin_port), node->nd_num); +if (o2nm_this_node ()>= node->nd_num) {
+ local_node = o2nm_get_node_by_num(o2nm_this_node());
Quoted 20 lines
fs/ocfs2/cluster/tcp.c +7
-0+mlog (ML_NOTICE ,"unexpected connect attempt seen at node '%s' (" +"%u, %pI4:%d) from node '%s' (%u, %pI4:%d)\n" , + local_node->nd_name, local_node->nd_num, + &(local_node->nd_ipv4_address), +ntohs (local_node->nd_ipv4_port), + node->nd_name, node->nd_num,&sin.sin_addr.s_addr, +ntohs (sin.sin_port)); ret = -EINVAL ; goto out;}fs/ocfs2/cluster/tcp.c +2
-0@@ -1857,6 +1861,8 @@ out:sock_release (new_sock);if (node)o2nm_node_put (node); +if (local_node) +o2nm_node_put (local_node);if (sc)sc_put (sc);return ret;