Skip to contentSkip to conversation

Verify all destination ports in sctp_connectx.

PATCH New Vlad Yasevich 1 participant 1 message Apr 23, 2007

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Verify all destination ports in sctp_connectx.

Hi David

Please apply. This was recently uncovered on the sctp-implementers list as 'linux doing something stupid...'

Thanks
-vlad

[SCTP] Verify all destination ports in sctp_connectx.

We need to make sure that all destination ports are the same, since the association really must not connect to multiple different ports at once. This was reported on the sctp-impl list.

---
 net/sctp/socket.c |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)
net/sctp/socket.c +8 -0
index 536298c..6bfae12 100644
@@ -966,6 +966,7 @@ static int __sctp_connect(struct sock* sk,
 	int walk_size = 0;
 	union sctp_addr *sa_addr;
 	void *addr_buf;
+	unsigned short port;
 
 	sp = sctp_sk(sk);
 	ep = sp->ep;
@@ -986,6 +987,7 @@ static int __sctp_connect(struct sock* sk,
 	while (walk_size < addrs_size) {
 		sa_addr = (union sctp_addr *)addr_buf;
 		af = sctp_get_af_specific(sa_addr->sa.sa_family);
+		port = ntohs(sa_addr->v4.sin_port);
 
 		/* If the address family is not supported or if this address
 		 * causes the address buffer to overflow return EINVAL.
@@ -999,6 +1001,12 @@ static int __sctp_connect(struct sock* sk,
 		if (err)
 			goto out_free;
 
+		/* Make sure the destination port is set to the same 
+		 * value in each address.
+		 */
+		if (asoc && asoc->peer.port && asoc->peer.port != port)
+			goto out_free;
+
 		memcpy(&to, sa_addr, af->sockaddr_len);
 
 		/* Check if there already is a matching association on the
Signature · 1 line
1.5.0.3.438.gc49b2