net: check the length of the socket address passed to connect(2)
Subsystems (5)
PATCH 1/1 net: check the length of the socket address passed to connect(2)
check the length of the socket address passed to connect(2).
Check the length of the socket address passed to connect(2). If the length is invalid, -EINVAL will be returned.
Signed-off-by Changli Gao <[email protected]>
----net/bluetooth/l2cap.c | 3 ++-net/bluetooth/rfcomm/sock.c | 3 ++-net/bluetooth/sco.c | 3 ++-net/can/bcm.c | 3 +++net/ieee802154/af_ieee802154.c | 3 +++net/ipv4/af_inet.c | 5 +++++net/netlink/af_netlink.c | 3 +++
7 files changed, 20 insertions(+), 3 deletions(-)
net/bluetooth/l2cap.c +2 -1
@@ -1002,7 +1002,8 @@ static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int alBT_DBG ("sk %p" , sk); -if (!addr || addr->sa_family !=AF_BLUETOOTH ) +if (!addr || alen <sizeof (addr->sa_family) || + addr->sa_family !=AF_BLUETOOTH )return -EINVAL ;memset (&la,0 ,sizeof (la));
net/bluetooth/rfcomm/sock.c +2 -1
@@ -397,7 +397,8 @@ static int rfcomm_sock_connect(struct socket *sock, struct sockaddr *addr, int aBT_DBG ("sk %p" , sk); -if (addr->sa_family !=AF_BLUETOOTH || alen <sizeof (struct sockaddr_rc )) +if (alen <sizeof (struct sockaddr_rc ) || + addr->sa_family !=AF_BLUETOOTH )return -EINVAL ;lock_sock (sk);
net/bluetooth/sco.c +2 -1
@@ -499,7 +499,8 @@ static int sco_sock_connect(struct socket *sock, struct sockaddr *addr, int alenBT_DBG ("sk %p" , sk); -if (addr->sa_family !=AF_BLUETOOTH || alen <sizeof (struct sockaddr_sco )) +if (alen <sizeof (struct sockaddr_sco ) || + addr->sa_family !=AF_BLUETOOTH )return -EINVAL ;if (sk->sk_state !=BT_OPEN && sk->sk_state !=BT_BOUND )
net/can/bcm.c +3 -0
@@ -1479,6 +1479,9 @@ static int bcm_connect(struct socket *sock, struct sockaddr *uaddr, int len,struct sock *sk = sock->sk;struct bcm_sock *bo =bcm_sk (sk); +if (len <sizeof (*addr)) +return -EINVAL ; +if (bo->bound)return -EISCONN ;
net/ieee802154/af_ieee802154.c +3 -0
@@ -127,6 +127,9 @@ static int ieee802154_sock_connect(struct socket *sock, struct sockaddr *uaddr, {struct sock *sk = sock->sk; +if (addr_len <sizeof (uaddr->sa_family)) +return -EINVAL ; +if (uaddr->sa_family ==AF_UNSPEC )return sk->sk_prot->disconnect (sk, flags);
net/ipv4/af_inet.c +5 -0
@@ -531,6 +531,8 @@ int inet_dgram_connect(struct socket *sock, struct sockaddr * uaddr, {struct sock *sk = sock->sk; +if (addr_len <sizeof (uaddr->sa_family)) +return -EINVAL ;if (uaddr->sa_family ==AF_UNSPEC )return sk->sk_prot->disconnect (sk, flags);
@@ -574,6 +576,9 @@ int inet_stream_connect(struct socket *sock, struct sockaddr *uaddr,int err;long timeo; +if (addr_len <sizeof (uaddr->sa_family)) +return -EINVAL ; +lock_sock (sk);if (uaddr->sa_family ==AF_UNSPEC ) {
net/netlink/af_netlink.c +3 -0
@@ -683,6 +683,9 @@ static int netlink_connect(struct socket *sock, struct sockaddr *addr,struct netlink_sock *nlk =nlk_sk (sk);struct sockaddr_nl *nladdr = (struct sockaddr_nl *)addr; +if (alen <sizeof (addr->sa_family)) +return -EINVAL ; +if (addr->sa_family ==AF_UNSPEC ) { sk->sk_state =NETLINK_UNCONNECTED ; nlk->dst_pid =0 ;
From: Changli Gao <[email protected]>
Date: Thu, 01 Apr 2010 16:58:26 +0800
Quoted 6 lines
check the length of the socket address passed to connect(2).
Check the length of the socket address passed to connect(2). If the length is invalid,
-EINVALwill be returned.Signed-off-by Changli Gao <[email protected]>
Applied.