aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/socket.c
diff options
context:
space:
mode:
authorAllan Stephens <allan.stephens@windriver.com>2006-06-26 02:49:06 -0400
committerDavid S. Miller <davem@davemloft.net>2006-06-26 02:49:06 -0400
commit51f9cc1ff8aa0866ff8fb3c06be4c64b5edbb2e8 (patch)
treeba3bfa86415fb9afa88e764672beb6fb9014b231 /net/tipc/socket.c
parenta3b0a5a9d004002a9cf9cf7a9d10cf1447a73d2b (diff)
[TIPC]: Optimized argument validation done by connect().
Signed-off-by: Allan Stephens <allan.stephens@windriver.com> Signed-off-by: Per Liden <per.liden@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/socket.c')
-rw-r--r--net/tipc/socket.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index 6d4d2b0063aa..32d778448a00 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -455,7 +455,8 @@ static int send_msg(struct kiocb *iocb, struct socket *sock,
455 455
456 if (unlikely(!dest)) 456 if (unlikely(!dest))
457 return -EDESTADDRREQ; 457 return -EDESTADDRREQ;
458 if (unlikely(dest->family != AF_TIPC)) 458 if (unlikely((m->msg_namelen < sizeof(*dest)) ||
459 (dest->family != AF_TIPC)))
459 return -EINVAL; 460 return -EINVAL;
460 461
461 needs_conn = (sock->state != SS_READY); 462 needs_conn = (sock->state != SS_READY);
@@ -1245,7 +1246,8 @@ static int connect(struct socket *sock, struct sockaddr *dest, int destlen,
1245 if (sock->state == SS_READY) 1246 if (sock->state == SS_READY)
1246 return -EOPNOTSUPP; 1247 return -EOPNOTSUPP;
1247 1248
1248 /* MOVE THE REST OF THIS ERROR CHECKING TO send_msg()? */ 1249 /* Issue Posix-compliant error code if socket is in the wrong state */
1250
1249 if (sock->state == SS_LISTENING) 1251 if (sock->state == SS_LISTENING)
1250 return -EOPNOTSUPP; 1252 return -EOPNOTSUPP;
1251 if (sock->state == SS_CONNECTING) 1253 if (sock->state == SS_CONNECTING)
@@ -1253,13 +1255,20 @@ static int connect(struct socket *sock, struct sockaddr *dest, int destlen,
1253 if (sock->state != SS_UNCONNECTED) 1255 if (sock->state != SS_UNCONNECTED)
1254 return -EISCONN; 1256 return -EISCONN;
1255 1257
1256 if ((destlen < sizeof(*dst)) || (dst->family != AF_TIPC) || 1258 /*
1257 ((dst->addrtype != TIPC_ADDR_NAME) && (dst->addrtype != TIPC_ADDR_ID))) 1259 * Reject connection attempt using multicast address
1260 *
1261 * Note: send_msg() validates the rest of the address fields,
1262 * so there's no need to do it here
1263 */
1264
1265 if (dst->addrtype == TIPC_ADDR_MCAST)
1258 return -EINVAL; 1266 return -EINVAL;
1259 1267
1260 /* Send a 'SYN-' to destination */ 1268 /* Send a 'SYN-' to destination */
1261 1269
1262 m.msg_name = dest; 1270 m.msg_name = dest;
1271 m.msg_namelen = destlen;
1263 if ((res = send_msg(NULL, sock, &m, 0)) < 0) { 1272 if ((res = send_msg(NULL, sock, &m, 0)) < 0) {
1264 sock->state = SS_DISCONNECTING; 1273 sock->state = SS_DISCONNECTING;
1265 return res; 1274 return res;