Skip to content

Commit

Permalink
dlm: fix connection stealing if using SCTP
Browse files Browse the repository at this point in the history
When using SCTP and accepting a new connection, DLM currently validates
if the peer trying to connect to it is one of the cluster nodes, but it
doesn't check if it already has a connection to it or not.

If it already had a connection, it will be overwritten, and the new one
will be used for writes, possibly causing the node to leave the cluster
due to communication breakage.

Still, one could DoS the node by attempting N connections and keeping
them open.

As said, but being explicit, both situations are only triggerable from
other cluster nodes, but are doable with only user-level perms.

Signed-off-by: Marcelo Ricardo Leitner <[email protected]>
Signed-off-by: David Teigland <[email protected]>
  • Loading branch information
marceloleitner authored and teigland committed Aug 17, 2015
1 parent f7644cb commit 28926a0
Showing 1 changed file with 11 additions and 1 deletion.
12 changes: 11 additions & 1 deletion fs/dlm/lowcomms.c
Original file line number Diff line number Diff line change
Expand Up @@ -535,7 +535,9 @@ static void close_connection(struct connection *con, bool and_other)
mutex_unlock(&con->sock_mutex);
}

/* We only send shutdown messages to nodes that are not part of the cluster */
/* We only send shutdown messages to nodes that are not part of the cluster
* or if we get multiple connections from a node.
*/
static void sctp_send_shutdown(sctp_assoc_t associd)
{
static char outcmsg[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];
Expand Down Expand Up @@ -718,6 +720,14 @@ static void process_sctp_notification(struct connection *con,
if (!new_con)
return;

if (new_con->sock) {
log_print("reject connect from node %d: "
"already has a connection.",
nodeid);
sctp_send_shutdown(prim.ssp_assoc_id);
return;
}

/* Peel off a new sock */
lock_sock(con->sock->sk);
ret = sctp_do_peeloff(con->sock->sk,
Expand Down

0 comments on commit 28926a0

Please sign in to comment.