lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:	Fri,  4 Apr 2008 16:59:45 -0400
From:	Allan Stephens <allan.stephens@...driver.com>
To:	David Miller <davem@...emloft.net>
Cc:	netdev@...r.kernel.org, allan.stephens@...driver.com
Subject: [PATCH net-2.6.26] [TIPC]: Eliminate port pointer in TIPC socket object

This patch eliminates the "port" pointer in the TIPC socket
object by storing this info in the (previously unused)
sk_user_data field of the standard sock structure.

Signed-off-by: Allan Stephens <allan.stephens@...driver.com>
---
 net/tipc/socket.c |  129 ++++++++++++++++++++++++++++++----------------------
 1 files changed, 74 insertions(+), 55 deletions(-)

diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index 1b5fb61..4ad1807 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -60,9 +60,10 @@
 
 #define OVERLOAD_LIMIT_BASE    5000
 
+#define sock_port(sk) ((struct tipc_port *)(sk)->sk_user_data)
+
 struct tipc_sock {
 	struct sock sk;
-	struct tipc_port *p;
 	struct mutex lock;
 };
 
@@ -90,7 +91,7 @@ static atomic_t tipc_queue_size = ATOMIC_INIT(0);
  */
 static void sock_lock(struct tipc_sock* tsock)
 {
-	spin_lock_bh(tsock->p->lock);
+	spin_lock_bh(sock_port(&tsock->sk)->lock);
 }
 
 /*
@@ -98,7 +99,7 @@ static void sock_lock(struct tipc_sock* tsock)
  */
 static void sock_unlock(struct tipc_sock* tsock)
 {
-	spin_unlock_bh(tsock->p->lock);
+	spin_unlock_bh(sock_port(&tsock->sk)->lock);
 }
 
 /**
@@ -127,7 +128,6 @@ static void advance_queue(struct tipc_sock *tsock)
 static int tipc_create(struct net *net, struct socket *sock, int protocol)
 {
 	struct tipc_sock *tsock;
-	struct tipc_port *port;
 	struct sock *sk;
 	u32 ref;
 
@@ -174,10 +174,9 @@ static int tipc_create(struct net *net, struct socket *sock, int protocol)
 	sk->sk_rcvtimeo = 8 * HZ;   /* default connect timeout = 8s */
 
 	tsock = tipc_sk(sk);
-	port = tipc_get_port(ref);
 
-	tsock->p = port;
-	port->usr_handle = tsock;
+	sk->sk_user_data = (void *)tipc_get_port(ref);
+	sock_port(sk)->usr_handle = tsock;
 
 	mutex_init(&tsock->lock);
 
@@ -209,11 +208,11 @@ static int release(struct socket *sock)
 {
 	struct tipc_sock *tsock = tipc_sk(sock->sk);
 	struct sock *sk = sock->sk;
-	int res = TIPC_OK;
+	struct tipc_port *tport;
 	struct sk_buff *buf;
+	int res = TIPC_OK;
 
-	dbg("sock_delete: %x\n",tsock);
-	if (!tsock)
+	if (sk == NULL)
 		return 0;
 	mutex_lock(&tsock->lock);
 	if (!sock->sk) {
@@ -221,13 +220,15 @@ static int release(struct socket *sock)
 		return 0;
 	}
 
+	tport = sock_port(sk);
+
 	/* Reject unreceived messages, unless no longer connected */
 
 	while (sock->state != SS_DISCONNECTING) {
 		sock_lock(tsock);
 		buf = skb_dequeue(&sk->sk_receive_queue);
 		if (!buf)
-			tsock->p->usr_handle = NULL;
+			tport->usr_handle = NULL;
 		sock_unlock(tsock);
 		if (!buf)
 			break;
@@ -240,7 +241,7 @@ static int release(struct socket *sock)
 
 	/* Delete TIPC port */
 
-	res = tipc_deleteport(tsock->p->ref);
+	res = tipc_deleteport(tport->ref);
 	sock->sk = NULL;
 
 	/* Discard any remaining messages */
@@ -275,13 +276,14 @@ static int bind(struct socket *sock, struct sockaddr *uaddr, int uaddr_len)
 {
 	struct tipc_sock *tsock = tipc_sk(sock->sk);
 	struct sockaddr_tipc *addr = (struct sockaddr_tipc *)uaddr;
+	u32 portref = sock_port(sock->sk)->ref;
 	int res;
 
 	if (mutex_lock_interruptible(&tsock->lock))
 		return -ERESTARTSYS;
 
 	if (unlikely(!uaddr_len)) {
-		res = tipc_withdraw(tsock->p->ref, 0, NULL);
+		res = tipc_withdraw(portref, 0, NULL);
 		goto exit;
 	}
 
@@ -302,11 +304,9 @@ static int bind(struct socket *sock, struct sockaddr *uaddr, int uaddr_len)
 	}
 
 	if (addr->scope > 0)
-		res = tipc_publish(tsock->p->ref, addr->scope,
-				   &addr->addr.nameseq);
+		res = tipc_publish(portref, addr->scope, &addr->addr.nameseq);
 	else
-		res = tipc_withdraw(tsock->p->ref, -addr->scope,
-				    &addr->addr.nameseq);
+		res = tipc_withdraw(portref, -addr->scope, &addr->addr.nameseq);
 exit:
 	mutex_unlock(&tsock->lock);
 	return res;
@@ -327,6 +327,7 @@ static int get_name(struct socket *sock, struct sockaddr *uaddr,
 {
 	struct tipc_sock *tsock = tipc_sk(sock->sk);
 	struct sockaddr_tipc *addr = (struct sockaddr_tipc *)uaddr;
+	u32 portref = sock_port(sock->sk)->ref;
 	u32 res;
 
 	if (mutex_lock_interruptible(&tsock->lock))
@@ -337,9 +338,9 @@ static int get_name(struct socket *sock, struct sockaddr *uaddr,
 	addr->family = AF_TIPC;
 	addr->scope = 0;
 	if (peer)
-		res = tipc_peer(tsock->p->ref, &addr->addr.id);
+		res = tipc_peer(portref, &addr->addr.id);
 	else
-		res = tipc_ownidentity(tsock->p->ref, &addr->addr.id);
+		res = tipc_ownidentity(portref, &addr->addr.id);
 	addr->addr.name.domain = 0;
 
 	mutex_unlock(&tsock->lock);
@@ -444,6 +445,8 @@ static int dest_name_check(struct sockaddr_tipc *dest, struct msghdr *m)
 static int send_msg(struct kiocb *iocb, struct socket *sock,
 		    struct msghdr *m, size_t total_len)
 {
+	struct sock *sk = sock->sk;
+	struct tipc_port *tport = sock_port(sk);
 	struct tipc_sock *tsock = tipc_sk(sock->sk);
 	struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name;
 	struct sk_buff *buf;
@@ -462,12 +465,12 @@ static int send_msg(struct kiocb *iocb, struct socket *sock,
 			return -EPIPE;
 		if (sock->state != SS_UNCONNECTED)
 			return -EISCONN;
-		if ((tsock->p->published) ||
+		if ((tport->published) ||
 		    ((sock->type == SOCK_STREAM) && (total_len != 0)))
 			return -EOPNOTSUPP;
 		if (dest->addrtype == TIPC_ADDR_NAME) {
-			tsock->p->conn_type = dest->addr.name.name.type;
-			tsock->p->conn_instance = dest->addr.name.name.instance;
+			tport->conn_type = dest->addr.name.name.type;
+			tport->conn_instance = dest->addr.name.name.instance;
 		}
 	}
 
@@ -490,14 +493,14 @@ static int send_msg(struct kiocb *iocb, struct socket *sock,
 		if (dest->addrtype == TIPC_ADDR_NAME) {
 			if ((res = dest_name_check(dest, m)))
 				goto exit;
-			res = tipc_send2name(tsock->p->ref,
+			res = tipc_send2name(tport->ref,
 					     &dest->addr.name.name,
 					     dest->addr.name.domain,
 					     m->msg_iovlen,
 					     m->msg_iov);
 		}
 		else if (dest->addrtype == TIPC_ADDR_ID) {
-			res = tipc_send2port(tsock->p->ref,
+			res = tipc_send2port(tport->ref,
 					     &dest->addr.id,
 					     m->msg_iovlen,
 					     m->msg_iov);
@@ -509,7 +512,7 @@ static int send_msg(struct kiocb *iocb, struct socket *sock,
 			}
 			if ((res = dest_name_check(dest, m)))
 				goto exit;
-			res = tipc_multicast(tsock->p->ref,
+			res = tipc_multicast(tport->ref,
 					     &dest->addr.nameseq,
 					     0,
 					     m->msg_iovlen,
@@ -525,7 +528,7 @@ exit:
 			goto exit;
 		}
 		if (wait_event_interruptible(*sock->sk->sk_sleep,
-					     !tsock->p->congested)) {
+					     !tport->congested)) {
 		    res = -ERESTARTSYS;
 		    goto exit;
 		}
@@ -547,6 +550,8 @@ exit:
 static int send_packet(struct kiocb *iocb, struct socket *sock,
 		       struct msghdr *m, size_t total_len)
 {
+	struct sock *sk = sock->sk;
+	struct tipc_port *tport = sock_port(sk);
 	struct tipc_sock *tsock = tipc_sk(sock->sk);
 	struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name;
 	int res;
@@ -569,7 +574,7 @@ static int send_packet(struct kiocb *iocb, struct socket *sock,
 			goto exit;
 		}
 
-		res = tipc_send(tsock->p->ref, m->msg_iovlen, m->msg_iov);
+		res = tipc_send(tport->ref, m->msg_iovlen, m->msg_iov);
 		if (likely(res != -ELINKCONG)) {
 exit:
 			mutex_unlock(&tsock->lock);
@@ -580,7 +585,7 @@ exit:
 			goto exit;
 		}
 		if (wait_event_interruptible(*sock->sk->sk_sleep,
-					     !tsock->p->congested)) {
+					     !tport->congested)) {
 		    res = -ERESTARTSYS;
 		    goto exit;
 		}
@@ -604,7 +609,8 @@ exit:
 static int send_stream(struct kiocb *iocb, struct socket *sock,
 		       struct msghdr *m, size_t total_len)
 {
-	struct tipc_port *tport;
+	struct sock *sk = sock->sk;
+	struct tipc_port *tport = sock_port(sk);
 	struct msghdr my_msg;
 	struct iovec my_iov;
 	struct iovec *curr_iov;
@@ -646,7 +652,6 @@ static int send_stream(struct kiocb *iocb, struct socket *sock,
 	my_msg.msg_name = NULL;
 	bytes_sent = 0;
 
-	tport = tipc_sk(sock->sk)->p;
 	hdr_size = msg_hdr_sz(&tport->phdr);
 
 	while (curr_iovlen--) {
@@ -689,6 +694,7 @@ static int send_stream(struct kiocb *iocb, struct socket *sock,
 static int auto_connect(struct socket *sock, struct tipc_sock *tsock,
 			struct tipc_msg *msg)
 {
+	struct tipc_port *tport = sock_port(sock->sk);
 	struct tipc_portid peer;
 
 	if (msg_errcode(msg)) {
@@ -698,8 +704,8 @@ static int auto_connect(struct socket *sock, struct tipc_sock *tsock,
 
 	peer.ref = msg_origport(msg);
 	peer.node = msg_orignode(msg);
-	tipc_connect2port(tsock->p->ref, &peer);
-	tipc_set_portimportance(tsock->p->ref, msg_importance(msg));
+	tipc_connect2port(tport->ref, &peer);
+	tipc_set_portimportance(tport->ref, msg_importance(msg));
 	sock->state = SS_CONNECTED;
 	return 0;
 }
@@ -812,6 +818,8 @@ static int anc_data_recv(struct msghdr *m, struct tipc_msg *msg,
 static int recv_msg(struct kiocb *iocb, struct socket *sock,
 		    struct msghdr *m, size_t buf_len, int flags)
 {
+	struct sock *sk = sock->sk;
+	struct tipc_port *tport = sock_port(sk);
 	struct tipc_sock *tsock = tipc_sk(sock->sk);
 	struct sk_buff *buf;
 	struct tipc_msg *msg;
@@ -892,7 +900,8 @@ restart:
 
 	/* Capture ancillary data (optional) */
 
-	if ((res = anc_data_recv(m, msg, tsock->p)))
+	res = anc_data_recv(m, msg, tport);
+	if (res)
 		goto exit;
 
 	/* Capture message data (if valid) & compute return value (always) */
@@ -919,8 +928,8 @@ restart:
 	/* Consume received message (optional) */
 
 	if (likely(!(flags & MSG_PEEK))) {
-		if (unlikely(++tsock->p->conn_unacked >= TIPC_FLOW_CONTROL_WIN))
-			tipc_acknowledge(tsock->p->ref, tsock->p->conn_unacked);
+		if (unlikely(++tport->conn_unacked >= TIPC_FLOW_CONTROL_WIN))
+			tipc_acknowledge(tport->ref, tport->conn_unacked);
 		advance_queue(tsock);
 	}
 exit:
@@ -944,6 +953,8 @@ exit:
 static int recv_stream(struct kiocb *iocb, struct socket *sock,
 		       struct msghdr *m, size_t buf_len, int flags)
 {
+	struct sock *sk = sock->sk;
+	struct tipc_port *tport = sock_port(sk);
 	struct tipc_sock *tsock = tipc_sk(sock->sk);
 	struct sk_buff *buf;
 	struct tipc_msg *msg;
@@ -1018,7 +1029,8 @@ restart:
 
 	if (sz_copied == 0) {
 		set_orig_addr(m, msg);
-		if ((res = anc_data_recv(m, msg, tsock->p)))
+		res = anc_data_recv(m, msg, tport);
+		if (res)
 			goto exit;
 	}
 
@@ -1056,8 +1068,8 @@ restart:
 	/* Consume received message (optional) */
 
 	if (likely(!(flags & MSG_PEEK))) {
-		if (unlikely(++tsock->p->conn_unacked >= TIPC_FLOW_CONTROL_WIN))
-			tipc_acknowledge(tsock->p->ref, tsock->p->conn_unacked);
+		if (unlikely(++tport->conn_unacked >= TIPC_FLOW_CONTROL_WIN))
+			tipc_acknowledge(tport->ref, tport->conn_unacked);
 		advance_queue(tsock);
 	}
 
@@ -1344,7 +1356,7 @@ static int listen(struct socket *sock, int len)
  * Returns 0 on success, errno otherwise
  */
 
-static int accept(struct socket *sock, struct socket *newsock, int flags)
+static int accept(struct socket *sock, struct socket *new_sock, int flags)
 {
 	struct tipc_sock *tsock = tipc_sk(sock->sk);
 	struct sk_buff *buf;
@@ -1369,22 +1381,23 @@ static int accept(struct socket *sock, struct socket *newsock, int flags)
 	}
 	buf = skb_peek(&sock->sk->sk_receive_queue);
 
-	res = tipc_create(sock_net(sock->sk), newsock, 0);
+	res = tipc_create(sock_net(sock->sk), new_sock, 0);
 	if (!res) {
-		struct tipc_sock *new_tsock = tipc_sk(newsock->sk);
+		struct sock *new_sk = new_sock->sk;
+		struct tipc_port *new_tport = sock_port(new_sk);
+		u32 new_ref = new_tport->ref;
 		struct tipc_portid id;
 		struct tipc_msg *msg = buf_msg(buf);
-		u32 new_ref = new_tsock->p->ref;
 
 		id.ref = msg_origport(msg);
 		id.node = msg_orignode(msg);
 		tipc_connect2port(new_ref, &id);
-		newsock->state = SS_CONNECTED;
+		new_sock->state = SS_CONNECTED;
 
 		tipc_set_portimportance(new_ref, msg_importance(msg));
 		if (msg_named(msg)) {
-			new_tsock->p->conn_type = msg_nametype(msg);
-			new_tsock->p->conn_instance = msg_nameinst(msg);
+			new_tport->conn_type = msg_nametype(msg);
+			new_tport->conn_instance = msg_nameinst(msg);
 		}
 
 	       /*
@@ -1396,13 +1409,13 @@ static int accept(struct socket *sock, struct socket *newsock, int flags)
 		if (!msg_data_sz(msg)) {
 			struct msghdr m = {NULL,};
 
-			send_packet(NULL, newsock, &m, 0);
+			send_packet(NULL, new_sock, &m, 0);
 			advance_queue(tsock);
 		} else {
 			sock_lock(tsock);
 			skb_dequeue(&sock->sk->sk_receive_queue);
 			sock_unlock(tsock);
-			skb_queue_head(&newsock->sk->sk_receive_queue, buf);
+			skb_queue_head(&new_sock->sk->sk_receive_queue, buf);
 		}
 	}
 exit:
@@ -1422,6 +1435,8 @@ exit:
 
 static int shutdown(struct socket *sock, int how)
 {
+	struct sock *sk = sock->sk;
+	struct tipc_port *tport = sock_port(sk);
 	struct tipc_sock* tsock = tipc_sk(sock->sk);
 	struct sk_buff *buf;
 	int res;
@@ -1450,7 +1465,7 @@ restart:
 			tipc_reject_msg(buf, TIPC_CONN_SHUTDOWN);
 		}
 		else {
-			tipc_shutdown(tsock->p->ref);
+			tipc_shutdown(tport->ref);
 		}
 		sock_lock(tsock);
 
@@ -1464,7 +1479,7 @@ restart:
 			atomic_dec(&tipc_queue_size);
 			buf_discard(buf);
 		}
-		tsock->p->conn_unacked = 0;
+		tport->conn_unacked = 0;
 
 		/* fall through */
 
@@ -1500,6 +1515,8 @@ restart:
 static int setsockopt(struct socket *sock,
 		      int lvl, int opt, char __user *ov, int ol)
 {
+	struct sock *sk = sock->sk;
+	struct tipc_port *tport = sock_port(sk);
 	struct tipc_sock *tsock = tipc_sk(sock->sk);
 	u32 value;
 	int res;
@@ -1518,16 +1535,16 @@ static int setsockopt(struct socket *sock,
 
 	switch (opt) {
 	case TIPC_IMPORTANCE:
-		res = tipc_set_portimportance(tsock->p->ref, value);
+		res = tipc_set_portimportance(tport->ref, value);
 		break;
 	case TIPC_SRC_DROPPABLE:
 		if (sock->type != SOCK_STREAM)
-			res = tipc_set_portunreliable(tsock->p->ref, value);
+			res = tipc_set_portunreliable(tport->ref, value);
 		else
 			res = -ENOPROTOOPT;
 		break;
 	case TIPC_DEST_DROPPABLE:
-		res = tipc_set_portunreturnable(tsock->p->ref, value);
+		res = tipc_set_portunreturnable(tport->ref, value);
 		break;
 	case TIPC_CONN_TIMEOUT:
 		sock->sk->sk_rcvtimeo = (value * HZ / 1000);
@@ -1557,6 +1574,8 @@ static int setsockopt(struct socket *sock,
 static int getsockopt(struct socket *sock,
 		      int lvl, int opt, char __user *ov, int __user *ol)
 {
+	struct sock *sk = sock->sk;
+	struct tipc_port *tport = sock_port(sk);
 	struct tipc_sock *tsock = tipc_sk(sock->sk);
 	int len;
 	u32 value;
@@ -1574,13 +1593,13 @@ static int getsockopt(struct socket *sock,
 
 	switch (opt) {
 	case TIPC_IMPORTANCE:
-		res = tipc_portimportance(tsock->p->ref, &value);
+		res = tipc_portimportance(tport->ref, &value);
 		break;
 	case TIPC_SRC_DROPPABLE:
-		res = tipc_portunreliable(tsock->p->ref, &value);
+		res = tipc_portunreliable(tport->ref, &value);
 		break;
 	case TIPC_DEST_DROPPABLE:
-		res = tipc_portunreturnable(tsock->p->ref, &value);
+		res = tipc_portunreturnable(tport->ref, &value);
 		break;
 	case TIPC_CONN_TIMEOUT:
 		value = (sock->sk->sk_rcvtimeo * 1000) / HZ;
-- 
1.5.3.2

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ