Netdev List
 help / color / mirror / Atom feed
From: Paul Gortmaker <paul.gortmaker@windriver.com>
To: davem@davemloft.net
Cc: netdev@vger.kernel.org, Allan.Stephens@windriver.com,
	Allan Stephens <allan.stephens@windriver.com>,
	Paul Gortmaker <paul.gortmaker@windriver.com>
Subject: [PATCH net-next 18/20] tipc: Reject connection protocol message sent to unconnected port
Date: Fri, 24 Jun 2011 18:07:25 -0400	[thread overview]
Message-ID: <1308953247-25266-19-git-send-email-paul.gortmaker@windriver.com> (raw)
In-Reply-To: <1308953247-25266-1-git-send-email-paul.gortmaker@windriver.com>

From: Allan Stephens <allan.stephens@windriver.com>

Restructures the logic used in tipc_port_recv_proto_msg() to ensure
that incoming connection protocol messages are handled properly. The
routine now uses a two-stage process that first ensures the message
applies on an existing connection and then processes the request.
This corrects a loophole that allowed a connection probe request to
be processed if it was sent to an unconnected port that had no names
bound to it.

Signed-off-by: Allan Stephens <allan.stephens@windriver.com>
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
---
 net/tipc/port.c |   79 ++++++++++++++++++++++++++++---------------------------
 1 files changed, 40 insertions(+), 39 deletions(-)

diff --git a/net/tipc/port.c b/net/tipc/port.c
index 8be68e0..1b20b96 100644
--- a/net/tipc/port.c
+++ b/net/tipc/port.c
@@ -526,62 +526,63 @@ static struct sk_buff *port_build_peer_abort_msg(struct tipc_port *p_ptr, u32 er
 void tipc_port_recv_proto_msg(struct sk_buff *buf)
 {
 	struct tipc_msg *msg = buf_msg(buf);
-	struct tipc_port *p_ptr = tipc_port_lock(msg_destport(msg));
-	u32 err = TIPC_OK;
+	struct tipc_port *p_ptr;
 	struct sk_buff *r_buf = NULL;
-	struct sk_buff *abort_buf = NULL;
-
-	if (!p_ptr) {
-		err = TIPC_ERR_NO_PORT;
-	} else if (p_ptr->connected) {
-		if ((port_peernode(p_ptr) != msg_orignode(msg)) ||
-		    (port_peerport(p_ptr) != msg_origport(msg))) {
-			err = TIPC_ERR_NO_PORT;
-		} else if (msg_type(msg) == CONN_ACK) {
-			int wakeup = tipc_port_congested(p_ptr) &&
-				     p_ptr->congested &&
-				     p_ptr->wakeup;
-			p_ptr->acked += msg_msgcnt(msg);
-			if (tipc_port_congested(p_ptr))
-				goto exit;
-			p_ptr->congested = 0;
-			if (!wakeup)
-				goto exit;
-			p_ptr->wakeup(p_ptr);
-			goto exit;
-		}
-	} else if (p_ptr->published) {
-		err = TIPC_ERR_NO_PORT;
-	}
-	if (err) {
-		r_buf = port_build_proto_msg(msg_origport(msg),
-					     msg_orignode(msg),
-					     msg_destport(msg),
+	u32 orignode = msg_orignode(msg);
+	u32 origport = msg_origport(msg);
+	u32 destport = msg_destport(msg);
+	int wakeable;
+
+	/* Validate connection */
+
+	p_ptr = tipc_port_lock(destport);
+	if (!p_ptr || !p_ptr->connected ||
+	    (port_peernode(p_ptr) != orignode) ||
+	    (port_peerport(p_ptr) != origport)) {
+		r_buf = port_build_proto_msg(origport,
+					     orignode,
+					     destport,
 					     tipc_own_addr,
 					     TIPC_HIGH_IMPORTANCE,
 					     TIPC_CONN_MSG,
-					     err,
+					     TIPC_ERR_NO_PORT,
 					     0);
+		if (p_ptr)
+			tipc_port_unlock(p_ptr);
 		goto exit;
 	}
 
-	/* All is fine */
-	if (msg_type(msg) == CONN_PROBE) {
-		r_buf = port_build_proto_msg(msg_origport(msg),
-					     msg_orignode(msg),
-					     msg_destport(msg),
+	/* Process protocol message sent by peer */
+
+	switch (msg_type(msg)) {
+	case CONN_ACK:
+		wakeable = tipc_port_congested(p_ptr) && p_ptr->congested &&
+			p_ptr->wakeup;
+		p_ptr->acked += msg_msgcnt(msg);
+		if (!tipc_port_congested(p_ptr)) {
+			p_ptr->congested = 0;
+			if (wakeable)
+				p_ptr->wakeup(p_ptr);
+		}
+		break;
+	case CONN_PROBE:
+		r_buf = port_build_proto_msg(origport,
+					     orignode,
+					     destport,
 					     tipc_own_addr,
 					     CONN_MANAGER,
 					     CONN_PROBE_REPLY,
 					     TIPC_OK,
 					     0);
+		break;
+	default:
+		/* CONN_PROBE_REPLY or unrecognized - no action required */
+		break;
 	}
 	p_ptr->probing_state = CONFIRMED;
+	tipc_port_unlock(p_ptr);
 exit:
-	if (p_ptr)
-		tipc_port_unlock(p_ptr);
 	tipc_net_route_msg(r_buf);
-	tipc_net_route_msg(abort_buf);
 	buf_discard(buf);
 }
 
-- 
1.7.4.4


  parent reply	other threads:[~2011-06-24 22:07 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-06-24 22:07 [PATCH net-next 00/20] misc tipc updates / enhancements Paul Gortmaker
2011-06-24 22:07 ` [PATCH net-next 01/20] tipc: Convert fatal broadcast sanity check to non-fatal check Paul Gortmaker
2011-06-24 22:07 ` [PATCH net-next 02/20] tipc: Remove unused sanity test macro Paul Gortmaker
2011-06-24 22:07 ` [PATCH net-next 03/20] tipc: Standardize exit logic for message rejection handling Paul Gortmaker
2011-06-24 22:07 ` [PATCH net-next 04/20] tipc: Add sanity check to detect rejection of non-payload messages Paul Gortmaker
2011-06-24 22:07 ` [PATCH net-next 05/20] tipc: Optimize routing of returned payload messages Paul Gortmaker
2011-06-24 22:07 ` [PATCH net-next 06/20] tipc: Optimizations & corrections to message rejection Paul Gortmaker
2011-06-24 22:07 ` [PATCH net-next 07/20] tipc: Eliminate message header routines for caching destination node Paul Gortmaker
2011-06-24 22:07 ` [PATCH net-next 08/20] tipc: Eliminate redundant masking in message header routines Paul Gortmaker
2011-06-24 22:07 ` [PATCH net-next 09/20] tipc: Partition name table instance array info into two parts Paul Gortmaker
2011-06-24 22:07 ` [PATCH net-next 10/20] tipc: Convert name table publication lists to standard kernel lists Paul Gortmaker
2011-06-24 22:07 ` [PATCH net-next 11/20] tipc: Eliminate checks for empty zone list during name translation Paul Gortmaker
2011-06-24 22:07 ` [PATCH net-next 12/20] tipc: Correct typo in link statistics output Paul Gortmaker
2011-06-24 22:07 ` [PATCH net-next 13/20] tipc: Eliminate unused field in bearer structure Paul Gortmaker
2011-06-24 22:07 ` [PATCH net-next 14/20] tipc: Remove unnecessary includes in socket code Paul Gortmaker
2011-06-24 22:07 ` [PATCH net-next 15/20] tipc: Eliminate useless check when creating internal message Paul Gortmaker
2011-06-24 22:07 ` [PATCH net-next 16/20] tipc: Cleanup of message header size terminology Paul Gortmaker
2011-06-24 22:07 ` [PATCH net-next 17/20] tipc: Optimize creation of FIN messages Paul Gortmaker
2011-06-24 22:07 ` Paul Gortmaker [this message]
2011-06-24 22:07 ` [PATCH net-next 19/20] tipc: Don't create payload message using connection protocol routine Paul Gortmaker
2011-06-24 22:07 ` [PATCH net-next 20/20] tipc: Optimize creation of connection protocol messages Paul Gortmaker
2011-06-24 23:55 ` [PATCH net-next 00/20] misc tipc updates / enhancements David Miller

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=1308953247-25266-19-git-send-email-paul.gortmaker@windriver.com \
    --to=paul.gortmaker@windriver.com \
    --cc=Allan.Stephens@windriver.com \
    --cc=davem@davemloft.net \
    --cc=netdev@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox