diff options
| author | Steffen Hurrle <steffen@hurrle.net> | 2014-01-17 16:53:15 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2014-01-19 02:04:16 -0500 |
| commit | 342dfc306fb32155314dad277f3c3686b83fb9f1 (patch) | |
| tree | a0d220f9310725c72bac70945261c9282e7cf305 | |
| parent | ea02f9411d9faa3553ed09ce0ec9f00ceae9885e (diff) | |
net: add build-time checks for msg->msg_name size
This is a follow-up patch to f3d3342602f8bc ("net: rework recvmsg
handler msg_name and msg_namelen logic").
DECLARE_SOCKADDR validates that the structure we use for writing the
name information to is not larger than the buffer which is reserved
for msg->msg_name (which is 128 bytes). Also use DECLARE_SOCKADDR
consistently in sendmsg code paths.
Signed-off-by: Steffen Hurrle <steffen@hurrle.net>
Suggested-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
34 files changed, 68 insertions, 78 deletions
diff --git a/drivers/isdn/mISDN/socket.c b/drivers/isdn/mISDN/socket.c index 5cefb479c707..1be82284cf9d 100644 --- a/drivers/isdn/mISDN/socket.c +++ b/drivers/isdn/mISDN/socket.c | |||
| @@ -135,7 +135,7 @@ mISDN_sock_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 135 | return err; | 135 | return err; |
| 136 | 136 | ||
| 137 | if (msg->msg_name) { | 137 | if (msg->msg_name) { |
| 138 | struct sockaddr_mISDN *maddr = msg->msg_name; | 138 | DECLARE_SOCKADDR(struct sockaddr_mISDN *, maddr, msg->msg_name); |
| 139 | 139 | ||
| 140 | maddr->family = AF_ISDN; | 140 | maddr->family = AF_ISDN; |
| 141 | maddr->dev = _pms(sk)->dev->id; | 141 | maddr->dev = _pms(sk)->dev->id; |
| @@ -179,7 +179,6 @@ mISDN_sock_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
| 179 | struct sock *sk = sock->sk; | 179 | struct sock *sk = sock->sk; |
| 180 | struct sk_buff *skb; | 180 | struct sk_buff *skb; |
| 181 | int err = -ENOMEM; | 181 | int err = -ENOMEM; |
| 182 | struct sockaddr_mISDN *maddr; | ||
| 183 | 182 | ||
| 184 | if (*debug & DEBUG_SOCKET) | 183 | if (*debug & DEBUG_SOCKET) |
| 185 | printk(KERN_DEBUG "%s: len %d flags %x ch %d proto %x\n", | 184 | printk(KERN_DEBUG "%s: len %d flags %x ch %d proto %x\n", |
| @@ -214,7 +213,7 @@ mISDN_sock_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
| 214 | 213 | ||
| 215 | if (msg->msg_namelen >= sizeof(struct sockaddr_mISDN)) { | 214 | if (msg->msg_namelen >= sizeof(struct sockaddr_mISDN)) { |
| 216 | /* if we have a address, we use it */ | 215 | /* if we have a address, we use it */ |
| 217 | maddr = (struct sockaddr_mISDN *)msg->msg_name; | 216 | DECLARE_SOCKADDR(struct sockaddr_mISDN *, maddr, msg->msg_name); |
| 218 | mISDN_HEAD_ID(skb) = maddr->channel; | 217 | mISDN_HEAD_ID(skb) = maddr->channel; |
| 219 | } else { /* use default for L2 messages */ | 218 | } else { /* use default for L2 messages */ |
| 220 | if ((sk->sk_protocol == ISDN_P_LAPD_TE) || | 219 | if ((sk->sk_protocol == ISDN_P_LAPD_TE) || |
diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c index 7d424ac6e760..02806c6b2ff3 100644 --- a/net/appletalk/ddp.c +++ b/net/appletalk/ddp.c | |||
| @@ -1566,7 +1566,7 @@ static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr | |||
| 1566 | { | 1566 | { |
| 1567 | struct sock *sk = sock->sk; | 1567 | struct sock *sk = sock->sk; |
| 1568 | struct atalk_sock *at = at_sk(sk); | 1568 | struct atalk_sock *at = at_sk(sk); |
| 1569 | struct sockaddr_at *usat = (struct sockaddr_at *)msg->msg_name; | 1569 | DECLARE_SOCKADDR(struct sockaddr_at *, usat, msg->msg_name); |
| 1570 | int flags = msg->msg_flags; | 1570 | int flags = msg->msg_flags; |
| 1571 | int loopback = 0; | 1571 | int loopback = 0; |
| 1572 | struct sockaddr_at local_satalk, gsat; | 1572 | struct sockaddr_at local_satalk, gsat; |
| @@ -1764,7 +1764,7 @@ static int atalk_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr | |||
| 1764 | err = skb_copy_datagram_iovec(skb, offset, msg->msg_iov, copied); | 1764 | err = skb_copy_datagram_iovec(skb, offset, msg->msg_iov, copied); |
| 1765 | 1765 | ||
| 1766 | if (!err && msg->msg_name) { | 1766 | if (!err && msg->msg_name) { |
| 1767 | struct sockaddr_at *sat = msg->msg_name; | 1767 | DECLARE_SOCKADDR(struct sockaddr_at *, sat, msg->msg_name); |
| 1768 | sat->sat_family = AF_APPLETALK; | 1768 | sat->sat_family = AF_APPLETALK; |
| 1769 | sat->sat_port = ddp->deh_sport; | 1769 | sat->sat_port = ddp->deh_sport; |
| 1770 | sat->sat_addr.s_node = ddp->deh_snode; | 1770 | sat->sat_addr.s_node = ddp->deh_snode; |
diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c index 7bb1605bdfd9..c35c3f48fc0f 100644 --- a/net/ax25/af_ax25.c +++ b/net/ax25/af_ax25.c | |||
| @@ -1435,7 +1435,7 @@ out: | |||
| 1435 | static int ax25_sendmsg(struct kiocb *iocb, struct socket *sock, | 1435 | static int ax25_sendmsg(struct kiocb *iocb, struct socket *sock, |
| 1436 | struct msghdr *msg, size_t len) | 1436 | struct msghdr *msg, size_t len) |
| 1437 | { | 1437 | { |
| 1438 | struct sockaddr_ax25 *usax = (struct sockaddr_ax25 *)msg->msg_name; | 1438 | DECLARE_SOCKADDR(struct sockaddr_ax25 *, usax, msg->msg_name); |
| 1439 | struct sock *sk = sock->sk; | 1439 | struct sock *sk = sock->sk; |
| 1440 | struct sockaddr_ax25 sax; | 1440 | struct sockaddr_ax25 sax; |
| 1441 | struct sk_buff *skb; | 1441 | struct sk_buff *skb; |
| @@ -1640,7 +1640,7 @@ static int ax25_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1640 | ax25_digi digi; | 1640 | ax25_digi digi; |
| 1641 | ax25_address src; | 1641 | ax25_address src; |
| 1642 | const unsigned char *mac = skb_mac_header(skb); | 1642 | const unsigned char *mac = skb_mac_header(skb); |
| 1643 | struct sockaddr_ax25 *sax = msg->msg_name; | 1643 | DECLARE_SOCKADDR(struct sockaddr_ax25 *, sax, msg->msg_name); |
| 1644 | 1644 | ||
| 1645 | memset(sax, 0, sizeof(struct full_sockaddr_ax25)); | 1645 | memset(sax, 0, sizeof(struct full_sockaddr_ax25)); |
| 1646 | ax25_addr_parse(mac + 1, skb->data - mac - 1, &src, NULL, | 1646 | ax25_addr_parse(mac + 1, skb->data - mac - 1, &src, NULL, |
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index 20ef748b2906..d58f76bcebd1 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c | |||
| @@ -1413,7 +1413,7 @@ static void l2cap_sock_destruct(struct sock *sk) | |||
| 1413 | static void l2cap_skb_msg_name(struct sk_buff *skb, void *msg_name, | 1413 | static void l2cap_skb_msg_name(struct sk_buff *skb, void *msg_name, |
| 1414 | int *msg_namelen) | 1414 | int *msg_namelen) |
| 1415 | { | 1415 | { |
| 1416 | struct sockaddr_l2 *la = (struct sockaddr_l2 *) msg_name; | 1416 | DECLARE_SOCKADDR(struct sockaddr_l2 *, la, msg_name); |
| 1417 | 1417 | ||
| 1418 | memset(la, 0, sizeof(struct sockaddr_l2)); | 1418 | memset(la, 0, sizeof(struct sockaddr_l2)); |
| 1419 | la->l2_family = AF_BLUETOOTH; | 1419 | la->l2_family = AF_BLUETOOTH; |
diff --git a/net/can/bcm.c b/net/can/bcm.c index 46f20bfafc0e..3fc737b214c7 100644 --- a/net/can/bcm.c +++ b/net/can/bcm.c | |||
| @@ -1256,8 +1256,7 @@ static int bcm_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1256 | 1256 | ||
| 1257 | if (!ifindex && msg->msg_name) { | 1257 | if (!ifindex && msg->msg_name) { |
| 1258 | /* no bound device as default => check msg_name */ | 1258 | /* no bound device as default => check msg_name */ |
| 1259 | struct sockaddr_can *addr = | 1259 | DECLARE_SOCKADDR(struct sockaddr_can *, addr, msg->msg_name); |
| 1260 | (struct sockaddr_can *)msg->msg_name; | ||
| 1261 | 1260 | ||
| 1262 | if (msg->msg_namelen < sizeof(*addr)) | 1261 | if (msg->msg_namelen < sizeof(*addr)) |
| 1263 | return -EINVAL; | 1262 | return -EINVAL; |
| @@ -1568,6 +1567,7 @@ static int bcm_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1568 | sock_recv_ts_and_drops(msg, sk, skb); | 1567 | sock_recv_ts_and_drops(msg, sk, skb); |
| 1569 | 1568 | ||
| 1570 | if (msg->msg_name) { | 1569 | if (msg->msg_name) { |
| 1570 | __sockaddr_check_size(sizeof(struct sockaddr_can)); | ||
| 1571 | msg->msg_namelen = sizeof(struct sockaddr_can); | 1571 | msg->msg_namelen = sizeof(struct sockaddr_can); |
| 1572 | memcpy(msg->msg_name, skb->cb, msg->msg_namelen); | 1572 | memcpy(msg->msg_name, skb->cb, msg->msg_namelen); |
| 1573 | } | 1573 | } |
diff --git a/net/can/raw.c b/net/can/raw.c index 641e1c895123..07d72d852324 100644 --- a/net/can/raw.c +++ b/net/can/raw.c | |||
| @@ -675,8 +675,7 @@ static int raw_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
| 675 | int err; | 675 | int err; |
| 676 | 676 | ||
| 677 | if (msg->msg_name) { | 677 | if (msg->msg_name) { |
| 678 | struct sockaddr_can *addr = | 678 | DECLARE_SOCKADDR(struct sockaddr_can *, addr, msg->msg_name); |
| 679 | (struct sockaddr_can *)msg->msg_name; | ||
| 680 | 679 | ||
| 681 | if (msg->msg_namelen < sizeof(*addr)) | 680 | if (msg->msg_namelen < sizeof(*addr)) |
| 682 | return -EINVAL; | 681 | return -EINVAL; |
| @@ -775,6 +774,7 @@ static int raw_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 775 | sock_recv_ts_and_drops(msg, sk, skb); | 774 | sock_recv_ts_and_drops(msg, sk, skb); |
| 776 | 775 | ||
| 777 | if (msg->msg_name) { | 776 | if (msg->msg_name) { |
| 777 | __sockaddr_check_size(sizeof(struct sockaddr_can)); | ||
| 778 | msg->msg_namelen = sizeof(struct sockaddr_can); | 778 | msg->msg_namelen = sizeof(struct sockaddr_can); |
| 779 | memcpy(msg->msg_name, skb->cb, msg->msg_namelen); | 779 | memcpy(msg->msg_name, skb->cb, msg->msg_namelen); |
| 780 | } | 780 | } |
diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c index dd4d506ef923..2954dcbca832 100644 --- a/net/decnet/af_decnet.c +++ b/net/decnet/af_decnet.c | |||
| @@ -1808,6 +1808,7 @@ out: | |||
| 1808 | rv = (flags & MSG_PEEK) ? -sk->sk_err : sock_error(sk); | 1808 | rv = (flags & MSG_PEEK) ? -sk->sk_err : sock_error(sk); |
| 1809 | 1809 | ||
| 1810 | if ((rv >= 0) && msg->msg_name) { | 1810 | if ((rv >= 0) && msg->msg_name) { |
| 1811 | __sockaddr_check_size(sizeof(struct sockaddr_dn)); | ||
| 1811 | memcpy(msg->msg_name, &scp->peer, sizeof(struct sockaddr_dn)); | 1812 | memcpy(msg->msg_name, &scp->peer, sizeof(struct sockaddr_dn)); |
| 1812 | msg->msg_namelen = sizeof(struct sockaddr_dn); | 1813 | msg->msg_namelen = sizeof(struct sockaddr_dn); |
| 1813 | } | 1814 | } |
| @@ -1914,7 +1915,7 @@ static int dn_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1914 | int err = 0; | 1915 | int err = 0; |
| 1915 | size_t sent = 0; | 1916 | size_t sent = 0; |
| 1916 | int addr_len = msg->msg_namelen; | 1917 | int addr_len = msg->msg_namelen; |
| 1917 | struct sockaddr_dn *addr = (struct sockaddr_dn *)msg->msg_name; | 1918 | DECLARE_SOCKADDR(struct sockaddr_dn *, addr, msg->msg_name); |
| 1918 | struct sk_buff *skb = NULL; | 1919 | struct sk_buff *skb = NULL; |
| 1919 | struct dn_skb_cb *cb; | 1920 | struct dn_skb_cb *cb; |
| 1920 | size_t len; | 1921 | size_t len; |
diff --git a/net/ieee802154/dgram.c b/net/ieee802154/dgram.c index 1865fdf5a5a5..1846c1fe0d06 100644 --- a/net/ieee802154/dgram.c +++ b/net/ieee802154/dgram.c | |||
| @@ -291,9 +291,7 @@ static int dgram_recvmsg(struct kiocb *iocb, struct sock *sk, | |||
| 291 | size_t copied = 0; | 291 | size_t copied = 0; |
| 292 | int err = -EOPNOTSUPP; | 292 | int err = -EOPNOTSUPP; |
| 293 | struct sk_buff *skb; | 293 | struct sk_buff *skb; |
| 294 | struct sockaddr_ieee802154 *saddr; | 294 | DECLARE_SOCKADDR(struct sockaddr_ieee802154 *, saddr, msg->msg_name); |
| 295 | |||
| 296 | saddr = (struct sockaddr_ieee802154 *)msg->msg_name; | ||
| 297 | 295 | ||
| 298 | skb = skb_recv_datagram(sk, flags, noblock, &err); | 296 | skb = skb_recv_datagram(sk, flags, noblock, &err); |
| 299 | if (!skb) | 297 | if (!skb) |
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index a9fc435dc89f..22f15eb1c260 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c | |||
| @@ -390,7 +390,7 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len) | |||
| 390 | { | 390 | { |
| 391 | struct sock_exterr_skb *serr; | 391 | struct sock_exterr_skb *serr; |
| 392 | struct sk_buff *skb, *skb2; | 392 | struct sk_buff *skb, *skb2; |
| 393 | struct sockaddr_in *sin; | 393 | DECLARE_SOCKADDR(struct sockaddr_in *, sin, msg->msg_name); |
| 394 | struct { | 394 | struct { |
| 395 | struct sock_extended_err ee; | 395 | struct sock_extended_err ee; |
| 396 | struct sockaddr_in offender; | 396 | struct sockaddr_in offender; |
| @@ -416,7 +416,6 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len) | |||
| 416 | 416 | ||
| 417 | serr = SKB_EXT_ERR(skb); | 417 | serr = SKB_EXT_ERR(skb); |
| 418 | 418 | ||
| 419 | sin = (struct sockaddr_in *)msg->msg_name; | ||
| 420 | if (sin) { | 419 | if (sin) { |
| 421 | sin->sin_family = AF_INET; | 420 | sin->sin_family = AF_INET; |
| 422 | sin->sin_addr.s_addr = *(__be32 *)(skb_network_header(skb) + | 421 | sin->sin_addr.s_addr = *(__be32 *)(skb_network_header(skb) + |
diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c index cae5262a337c..e09e8839d622 100644 --- a/net/ipv4/ping.c +++ b/net/ipv4/ping.c | |||
| @@ -700,7 +700,7 @@ static int ping_v4_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *m | |||
| 700 | */ | 700 | */ |
| 701 | 701 | ||
| 702 | if (msg->msg_name) { | 702 | if (msg->msg_name) { |
| 703 | struct sockaddr_in *usin = (struct sockaddr_in *)msg->msg_name; | 703 | DECLARE_SOCKADDR(struct sockaddr_in *, usin, msg->msg_name); |
| 704 | if (msg->msg_namelen < sizeof(*usin)) | 704 | if (msg->msg_namelen < sizeof(*usin)) |
| 705 | return -EINVAL; | 705 | return -EINVAL; |
| 706 | if (usin->sin_family != AF_INET) | 706 | if (usin->sin_family != AF_INET) |
| @@ -873,7 +873,7 @@ int ping_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
| 873 | 873 | ||
| 874 | /* Copy the address and add cmsg data. */ | 874 | /* Copy the address and add cmsg data. */ |
| 875 | if (family == AF_INET) { | 875 | if (family == AF_INET) { |
| 876 | struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name; | 876 | DECLARE_SOCKADDR(struct sockaddr_in *, sin, msg->msg_name); |
| 877 | 877 | ||
| 878 | if (sin) { | 878 | if (sin) { |
| 879 | sin->sin_family = AF_INET; | 879 | sin->sin_family = AF_INET; |
| @@ -890,8 +890,7 @@ int ping_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
| 890 | } else if (family == AF_INET6) { | 890 | } else if (family == AF_INET6) { |
| 891 | struct ipv6_pinfo *np = inet6_sk(sk); | 891 | struct ipv6_pinfo *np = inet6_sk(sk); |
| 892 | struct ipv6hdr *ip6 = ipv6_hdr(skb); | 892 | struct ipv6hdr *ip6 = ipv6_hdr(skb); |
| 893 | struct sockaddr_in6 *sin6 = | 893 | DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, msg->msg_name); |
| 894 | (struct sockaddr_in6 *)msg->msg_name; | ||
| 895 | 894 | ||
| 896 | if (sin6) { | 895 | if (sin6) { |
| 897 | sin6->sin6_family = AF_INET6; | 896 | sin6->sin6_family = AF_INET6; |
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index 81e6cfd5a365..c04518f4850a 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c | |||
| @@ -493,7 +493,7 @@ static int raw_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
| 493 | */ | 493 | */ |
| 494 | 494 | ||
| 495 | if (msg->msg_namelen) { | 495 | if (msg->msg_namelen) { |
| 496 | struct sockaddr_in *usin = (struct sockaddr_in *)msg->msg_name; | 496 | DECLARE_SOCKADDR(struct sockaddr_in *, usin, msg->msg_name); |
| 497 | err = -EINVAL; | 497 | err = -EINVAL; |
| 498 | if (msg->msg_namelen < sizeof(*usin)) | 498 | if (msg->msg_namelen < sizeof(*usin)) |
| 499 | goto out; | 499 | goto out; |
| @@ -690,7 +690,7 @@ static int raw_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
| 690 | struct inet_sock *inet = inet_sk(sk); | 690 | struct inet_sock *inet = inet_sk(sk); |
| 691 | size_t copied = 0; | 691 | size_t copied = 0; |
| 692 | int err = -EOPNOTSUPP; | 692 | int err = -EOPNOTSUPP; |
| 693 | struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name; | 693 | DECLARE_SOCKADDR(struct sockaddr_in *, sin, msg->msg_name); |
| 694 | struct sk_buff *skb; | 694 | struct sk_buff *skb; |
| 695 | 695 | ||
| 696 | if (flags & MSG_OOB) | 696 | if (flags & MSG_OOB) |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 3d3141fd0580..77bd16fa9f34 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
| @@ -902,7 +902,7 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
| 902 | * Get and verify the address. | 902 | * Get and verify the address. |
| 903 | */ | 903 | */ |
| 904 | if (msg->msg_name) { | 904 | if (msg->msg_name) { |
| 905 | struct sockaddr_in *usin = (struct sockaddr_in *)msg->msg_name; | 905 | DECLARE_SOCKADDR(struct sockaddr_in *, usin, msg->msg_name); |
| 906 | if (msg->msg_namelen < sizeof(*usin)) | 906 | if (msg->msg_namelen < sizeof(*usin)) |
| 907 | return -EINVAL; | 907 | return -EINVAL; |
| 908 | if (usin->sin_family != AF_INET) { | 908 | if (usin->sin_family != AF_INET) { |
| @@ -1226,7 +1226,7 @@ int udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
| 1226 | size_t len, int noblock, int flags, int *addr_len) | 1226 | size_t len, int noblock, int flags, int *addr_len) |
| 1227 | { | 1227 | { |
| 1228 | struct inet_sock *inet = inet_sk(sk); | 1228 | struct inet_sock *inet = inet_sk(sk); |
| 1229 | struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name; | 1229 | DECLARE_SOCKADDR(struct sockaddr_in *, sin, msg->msg_name); |
| 1230 | struct sk_buff *skb; | 1230 | struct sk_buff *skb; |
| 1231 | unsigned int ulen, copied; | 1231 | unsigned int ulen, copied; |
| 1232 | int peeked, off = 0; | 1232 | int peeked, off = 0; |
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c index 6983058942ea..bce73cbd203a 100644 --- a/net/ipv6/datagram.c +++ b/net/ipv6/datagram.c | |||
| @@ -322,7 +322,7 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len) | |||
| 322 | struct ipv6_pinfo *np = inet6_sk(sk); | 322 | struct ipv6_pinfo *np = inet6_sk(sk); |
| 323 | struct sock_exterr_skb *serr; | 323 | struct sock_exterr_skb *serr; |
| 324 | struct sk_buff *skb, *skb2; | 324 | struct sk_buff *skb, *skb2; |
| 325 | struct sockaddr_in6 *sin; | 325 | DECLARE_SOCKADDR(struct sockaddr_in6 *, sin, msg->msg_name); |
| 326 | struct { | 326 | struct { |
| 327 | struct sock_extended_err ee; | 327 | struct sock_extended_err ee; |
| 328 | struct sockaddr_in6 offender; | 328 | struct sockaddr_in6 offender; |
| @@ -348,7 +348,6 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len) | |||
| 348 | 348 | ||
| 349 | serr = SKB_EXT_ERR(skb); | 349 | serr = SKB_EXT_ERR(skb); |
| 350 | 350 | ||
| 351 | sin = (struct sockaddr_in6 *)msg->msg_name; | ||
| 352 | if (sin) { | 351 | if (sin) { |
| 353 | const unsigned char *nh = skb_network_header(skb); | 352 | const unsigned char *nh = skb_network_header(skb); |
| 354 | sin->sin6_family = AF_INET6; | 353 | sin->sin6_family = AF_INET6; |
| @@ -429,8 +428,8 @@ int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len, | |||
| 429 | { | 428 | { |
| 430 | struct ipv6_pinfo *np = inet6_sk(sk); | 429 | struct ipv6_pinfo *np = inet6_sk(sk); |
| 431 | struct sk_buff *skb; | 430 | struct sk_buff *skb; |
| 432 | struct sockaddr_in6 *sin; | ||
| 433 | struct ip6_mtuinfo mtu_info; | 431 | struct ip6_mtuinfo mtu_info; |
| 432 | DECLARE_SOCKADDR(struct sockaddr_in6 *, sin, msg->msg_name); | ||
| 434 | int err; | 433 | int err; |
| 435 | int copied; | 434 | int copied; |
| 436 | 435 | ||
| @@ -452,7 +451,6 @@ int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len, | |||
| 452 | 451 | ||
| 453 | memcpy(&mtu_info, IP6CBMTU(skb), sizeof(mtu_info)); | 452 | memcpy(&mtu_info, IP6CBMTU(skb), sizeof(mtu_info)); |
| 454 | 453 | ||
| 455 | sin = (struct sockaddr_in6 *)msg->msg_name; | ||
| 456 | if (sin) { | 454 | if (sin) { |
| 457 | sin->sin6_family = AF_INET6; | 455 | sin->sin6_family = AF_INET6; |
| 458 | sin->sin6_flowinfo = 0; | 456 | sin->sin6_flowinfo = 0; |
diff --git a/net/ipv6/ping.c b/net/ipv6/ping.c index 15d23b8c2129..cd71f3a540be 100644 --- a/net/ipv6/ping.c +++ b/net/ipv6/ping.c | |||
| @@ -103,7 +103,7 @@ int ping_v6_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
| 103 | return err; | 103 | return err; |
| 104 | 104 | ||
| 105 | if (msg->msg_name) { | 105 | if (msg->msg_name) { |
| 106 | struct sockaddr_in6 *u = (struct sockaddr_in6 *) msg->msg_name; | 106 | DECLARE_SOCKADDR(struct sockaddr_in6 *, u, msg->msg_name); |
| 107 | if (msg->msg_namelen < sizeof(struct sockaddr_in6) || | 107 | if (msg->msg_namelen < sizeof(struct sockaddr_in6) || |
| 108 | u->sin6_family != AF_INET6) { | 108 | u->sin6_family != AF_INET6) { |
| 109 | return -EINVAL; | 109 | return -EINVAL; |
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 5f10b7ea7ccc..b4523117aeae 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
| @@ -457,7 +457,7 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk, | |||
| 457 | int noblock, int flags, int *addr_len) | 457 | int noblock, int flags, int *addr_len) |
| 458 | { | 458 | { |
| 459 | struct ipv6_pinfo *np = inet6_sk(sk); | 459 | struct ipv6_pinfo *np = inet6_sk(sk); |
| 460 | struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)msg->msg_name; | 460 | DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, msg->msg_name); |
| 461 | struct sk_buff *skb; | 461 | struct sk_buff *skb; |
| 462 | size_t copied; | 462 | size_t copied; |
| 463 | int err; | 463 | int err; |
| @@ -734,7 +734,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
| 734 | struct msghdr *msg, size_t len) | 734 | struct msghdr *msg, size_t len) |
| 735 | { | 735 | { |
| 736 | struct ipv6_txoptions opt_space; | 736 | struct ipv6_txoptions opt_space; |
| 737 | struct sockaddr_in6 * sin6 = (struct sockaddr_in6 *) msg->msg_name; | 737 | DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, msg->msg_name); |
| 738 | struct in6_addr *daddr, *final_p, final; | 738 | struct in6_addr *daddr, *final_p, final; |
| 739 | struct inet_sock *inet = inet_sk(sk); | 739 | struct inet_sock *inet = inet_sk(sk); |
| 740 | struct ipv6_pinfo *np = inet6_sk(sk); | 740 | struct ipv6_pinfo *np = inet6_sk(sk); |
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index fa9d988f4012..233c3ab6aee4 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
| @@ -460,9 +460,7 @@ try_again: | |||
| 460 | 460 | ||
| 461 | /* Copy the address. */ | 461 | /* Copy the address. */ |
| 462 | if (msg->msg_name) { | 462 | if (msg->msg_name) { |
| 463 | struct sockaddr_in6 *sin6; | 463 | DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, msg->msg_name); |
| 464 | |||
| 465 | sin6 = (struct sockaddr_in6 *) msg->msg_name; | ||
| 466 | sin6->sin6_family = AF_INET6; | 464 | sin6->sin6_family = AF_INET6; |
| 467 | sin6->sin6_port = udp_hdr(skb)->source; | 465 | sin6->sin6_port = udp_hdr(skb)->source; |
| 468 | sin6->sin6_flowinfo = 0; | 466 | sin6->sin6_flowinfo = 0; |
| @@ -1041,7 +1039,7 @@ int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
| 1041 | struct udp_sock *up = udp_sk(sk); | 1039 | struct udp_sock *up = udp_sk(sk); |
| 1042 | struct inet_sock *inet = inet_sk(sk); | 1040 | struct inet_sock *inet = inet_sk(sk); |
| 1043 | struct ipv6_pinfo *np = inet6_sk(sk); | 1041 | struct ipv6_pinfo *np = inet6_sk(sk); |
| 1044 | struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) msg->msg_name; | 1042 | DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, msg->msg_name); |
| 1045 | struct in6_addr *daddr, *final_p, final; | 1043 | struct in6_addr *daddr, *final_p, final; |
| 1046 | struct ipv6_txoptions *opt = NULL; | 1044 | struct ipv6_txoptions *opt = NULL; |
| 1047 | struct ip6_flowlabel *flowlabel = NULL; | 1045 | struct ip6_flowlabel *flowlabel = NULL; |
diff --git a/net/ipx/af_ipx.c b/net/ipx/af_ipx.c index e096025b477f..994e28bfb32e 100644 --- a/net/ipx/af_ipx.c +++ b/net/ipx/af_ipx.c | |||
| @@ -1707,7 +1707,7 @@ static int ipx_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1707 | { | 1707 | { |
| 1708 | struct sock *sk = sock->sk; | 1708 | struct sock *sk = sock->sk; |
| 1709 | struct ipx_sock *ipxs = ipx_sk(sk); | 1709 | struct ipx_sock *ipxs = ipx_sk(sk); |
| 1710 | struct sockaddr_ipx *usipx = (struct sockaddr_ipx *)msg->msg_name; | 1710 | DECLARE_SOCKADDR(struct sockaddr_ipx *, usipx, msg->msg_name); |
| 1711 | struct sockaddr_ipx local_sipx; | 1711 | struct sockaddr_ipx local_sipx; |
| 1712 | int rc = -EINVAL; | 1712 | int rc = -EINVAL; |
| 1713 | int flags = msg->msg_flags; | 1713 | int flags = msg->msg_flags; |
| @@ -1774,7 +1774,7 @@ static int ipx_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1774 | { | 1774 | { |
| 1775 | struct sock *sk = sock->sk; | 1775 | struct sock *sk = sock->sk; |
| 1776 | struct ipx_sock *ipxs = ipx_sk(sk); | 1776 | struct ipx_sock *ipxs = ipx_sk(sk); |
| 1777 | struct sockaddr_ipx *sipx = (struct sockaddr_ipx *)msg->msg_name; | 1777 | DECLARE_SOCKADDR(struct sockaddr_ipx *, sipx, msg->msg_name); |
| 1778 | struct ipxhdr *ipx = NULL; | 1778 | struct ipxhdr *ipx = NULL; |
| 1779 | struct sk_buff *skb; | 1779 | struct sk_buff *skb; |
| 1780 | int copied, rc; | 1780 | int copied, rc; |
diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c index 73baf9b346b6..54747c25c86c 100644 --- a/net/irda/af_irda.c +++ b/net/irda/af_irda.c | |||
| @@ -1652,7 +1652,7 @@ static int irda_sendmsg_ultra(struct kiocb *iocb, struct socket *sock, | |||
| 1652 | 1652 | ||
| 1653 | /* Check if an address was specified with sendto. Jean II */ | 1653 | /* Check if an address was specified with sendto. Jean II */ |
| 1654 | if (msg->msg_name) { | 1654 | if (msg->msg_name) { |
| 1655 | struct sockaddr_irda *addr = (struct sockaddr_irda *) msg->msg_name; | 1655 | DECLARE_SOCKADDR(struct sockaddr_irda *, addr, msg->msg_name); |
| 1656 | err = -EINVAL; | 1656 | err = -EINVAL; |
| 1657 | /* Check address, extract pid. Jean II */ | 1657 | /* Check address, extract pid. Jean II */ |
| 1658 | if (msg->msg_namelen < sizeof(*addr)) | 1658 | if (msg->msg_namelen < sizeof(*addr)) |
diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c index da1a1cee1a08..0b44d855269c 100644 --- a/net/l2tp/l2tp_ip.c +++ b/net/l2tp/l2tp_ip.c | |||
| @@ -403,7 +403,7 @@ static int l2tp_ip_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *m | |||
| 403 | 403 | ||
| 404 | /* Get and verify the address. */ | 404 | /* Get and verify the address. */ |
| 405 | if (msg->msg_name) { | 405 | if (msg->msg_name) { |
| 406 | struct sockaddr_l2tpip *lip = (struct sockaddr_l2tpip *) msg->msg_name; | 406 | DECLARE_SOCKADDR(struct sockaddr_l2tpip *, lip, msg->msg_name); |
| 407 | rc = -EINVAL; | 407 | rc = -EINVAL; |
| 408 | if (msg->msg_namelen < sizeof(*lip)) | 408 | if (msg->msg_namelen < sizeof(*lip)) |
| 409 | goto out; | 409 | goto out; |
| @@ -512,7 +512,7 @@ static int l2tp_ip_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *m | |||
| 512 | struct inet_sock *inet = inet_sk(sk); | 512 | struct inet_sock *inet = inet_sk(sk); |
| 513 | size_t copied = 0; | 513 | size_t copied = 0; |
| 514 | int err = -EOPNOTSUPP; | 514 | int err = -EOPNOTSUPP; |
| 515 | struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name; | 515 | DECLARE_SOCKADDR(struct sockaddr_in *, sin, msg->msg_name); |
| 516 | struct sk_buff *skb; | 516 | struct sk_buff *skb; |
| 517 | 517 | ||
| 518 | if (flags & MSG_OOB) | 518 | if (flags & MSG_OOB) |
diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c index 29487a8f7fa0..aab5f74e91e6 100644 --- a/net/l2tp/l2tp_ip6.c +++ b/net/l2tp/l2tp_ip6.c | |||
| @@ -481,8 +481,7 @@ static int l2tp_ip6_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
| 481 | struct msghdr *msg, size_t len) | 481 | struct msghdr *msg, size_t len) |
| 482 | { | 482 | { |
| 483 | struct ipv6_txoptions opt_space; | 483 | struct ipv6_txoptions opt_space; |
| 484 | struct sockaddr_l2tpip6 *lsa = | 484 | DECLARE_SOCKADDR(struct sockaddr_l2tpip6 *, lsa, msg->msg_name); |
| 485 | (struct sockaddr_l2tpip6 *) msg->msg_name; | ||
| 486 | struct in6_addr *daddr, *final_p, final; | 485 | struct in6_addr *daddr, *final_p, final; |
| 487 | struct ipv6_pinfo *np = inet6_sk(sk); | 486 | struct ipv6_pinfo *np = inet6_sk(sk); |
| 488 | struct ipv6_txoptions *opt = NULL; | 487 | struct ipv6_txoptions *opt = NULL; |
| @@ -652,7 +651,7 @@ static int l2tp_ip6_recvmsg(struct kiocb *iocb, struct sock *sk, | |||
| 652 | int flags, int *addr_len) | 651 | int flags, int *addr_len) |
| 653 | { | 652 | { |
| 654 | struct ipv6_pinfo *np = inet6_sk(sk); | 653 | struct ipv6_pinfo *np = inet6_sk(sk); |
| 655 | struct sockaddr_l2tpip6 *lsa = (struct sockaddr_l2tpip6 *)msg->msg_name; | 654 | DECLARE_SOCKADDR(struct sockaddr_l2tpip6 *, lsa, msg->msg_name); |
| 656 | size_t copied = 0; | 655 | size_t copied = 0; |
| 657 | int err = -EOPNOTSUPP; | 656 | int err = -EOPNOTSUPP; |
| 658 | struct sk_buff *skb; | 657 | struct sk_buff *skb; |
diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c index c71b699eb555..0080d2b0a8ae 100644 --- a/net/llc/af_llc.c +++ b/net/llc/af_llc.c | |||
| @@ -707,7 +707,7 @@ out: | |||
| 707 | static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock, | 707 | static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock, |
| 708 | struct msghdr *msg, size_t len, int flags) | 708 | struct msghdr *msg, size_t len, int flags) |
| 709 | { | 709 | { |
| 710 | struct sockaddr_llc *uaddr = (struct sockaddr_llc *)msg->msg_name; | 710 | DECLARE_SOCKADDR(struct sockaddr_llc *, uaddr, msg->msg_name); |
| 711 | const int nonblock = flags & MSG_DONTWAIT; | 711 | const int nonblock = flags & MSG_DONTWAIT; |
| 712 | struct sk_buff *skb = NULL; | 712 | struct sk_buff *skb = NULL; |
| 713 | struct sock *sk = sock->sk; | 713 | struct sock *sk = sock->sk; |
| @@ -884,7 +884,7 @@ static int llc_ui_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
| 884 | { | 884 | { |
| 885 | struct sock *sk = sock->sk; | 885 | struct sock *sk = sock->sk; |
| 886 | struct llc_sock *llc = llc_sk(sk); | 886 | struct llc_sock *llc = llc_sk(sk); |
| 887 | struct sockaddr_llc *addr = (struct sockaddr_llc *)msg->msg_name; | 887 | DECLARE_SOCKADDR(struct sockaddr_llc *, addr, msg->msg_name); |
| 888 | int flags = msg->msg_flags; | 888 | int flags = msg->msg_flags; |
| 889 | int noblock = flags & MSG_DONTWAIT; | 889 | int noblock = flags & MSG_DONTWAIT; |
| 890 | struct sk_buff *skb; | 890 | struct sk_buff *skb; |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 34a656d90175..fdf51353cf78 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
| @@ -2222,7 +2222,7 @@ static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock, | |||
| 2222 | struct sock_iocb *siocb = kiocb_to_siocb(kiocb); | 2222 | struct sock_iocb *siocb = kiocb_to_siocb(kiocb); |
| 2223 | struct sock *sk = sock->sk; | 2223 | struct sock *sk = sock->sk; |
| 2224 | struct netlink_sock *nlk = nlk_sk(sk); | 2224 | struct netlink_sock *nlk = nlk_sk(sk); |
| 2225 | struct sockaddr_nl *addr = msg->msg_name; | 2225 | DECLARE_SOCKADDR(struct sockaddr_nl *, addr, msg->msg_name); |
| 2226 | u32 dst_portid; | 2226 | u32 dst_portid; |
| 2227 | u32 dst_group; | 2227 | u32 dst_group; |
| 2228 | struct sk_buff *skb; | 2228 | struct sk_buff *skb; |
| @@ -2353,7 +2353,7 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock, | |||
| 2353 | err = skb_copy_datagram_iovec(data_skb, 0, msg->msg_iov, copied); | 2353 | err = skb_copy_datagram_iovec(data_skb, 0, msg->msg_iov, copied); |
| 2354 | 2354 | ||
| 2355 | if (msg->msg_name) { | 2355 | if (msg->msg_name) { |
| 2356 | struct sockaddr_nl *addr = (struct sockaddr_nl *)msg->msg_name; | 2356 | DECLARE_SOCKADDR(struct sockaddr_nl *, addr, msg->msg_name); |
| 2357 | addr->nl_family = AF_NETLINK; | 2357 | addr->nl_family = AF_NETLINK; |
| 2358 | addr->nl_pad = 0; | 2358 | addr->nl_pad = 0; |
| 2359 | addr->nl_pid = NETLINK_CB(skb).portid; | 2359 | addr->nl_pid = NETLINK_CB(skb).portid; |
diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c index 53c19a35fc6d..b74aa0755521 100644 --- a/net/netrom/af_netrom.c +++ b/net/netrom/af_netrom.c | |||
| @@ -1028,7 +1028,7 @@ static int nr_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1028 | { | 1028 | { |
| 1029 | struct sock *sk = sock->sk; | 1029 | struct sock *sk = sock->sk; |
| 1030 | struct nr_sock *nr = nr_sk(sk); | 1030 | struct nr_sock *nr = nr_sk(sk); |
| 1031 | struct sockaddr_ax25 *usax = (struct sockaddr_ax25 *)msg->msg_name; | 1031 | DECLARE_SOCKADDR(struct sockaddr_ax25 *, usax, msg->msg_name); |
| 1032 | int err; | 1032 | int err; |
| 1033 | struct sockaddr_ax25 sax; | 1033 | struct sockaddr_ax25 sax; |
| 1034 | struct sk_buff *skb; | 1034 | struct sk_buff *skb; |
| @@ -1137,7 +1137,7 @@ static int nr_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1137 | struct msghdr *msg, size_t size, int flags) | 1137 | struct msghdr *msg, size_t size, int flags) |
| 1138 | { | 1138 | { |
| 1139 | struct sock *sk = sock->sk; | 1139 | struct sock *sk = sock->sk; |
| 1140 | struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)msg->msg_name; | 1140 | DECLARE_SOCKADDR(struct sockaddr_ax25 *, sax, msg->msg_name); |
| 1141 | size_t copied; | 1141 | size_t copied; |
| 1142 | struct sk_buff *skb; | 1142 | struct sk_buff *skb; |
| 1143 | int er; | 1143 | int er; |
diff --git a/net/nfc/llcp_sock.c b/net/nfc/llcp_sock.c index 4a53bb58a463..51f077a92fa9 100644 --- a/net/nfc/llcp_sock.c +++ b/net/nfc/llcp_sock.c | |||
| @@ -769,8 +769,8 @@ static int llcp_sock_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
| 769 | lock_sock(sk); | 769 | lock_sock(sk); |
| 770 | 770 | ||
| 771 | if (sk->sk_type == SOCK_DGRAM) { | 771 | if (sk->sk_type == SOCK_DGRAM) { |
| 772 | struct sockaddr_nfc_llcp *addr = | 772 | DECLARE_SOCKADDR(struct sockaddr_nfc_llcp *, addr, |
| 773 | (struct sockaddr_nfc_llcp *)msg->msg_name; | 773 | msg->msg_name); |
| 774 | 774 | ||
| 775 | if (msg->msg_namelen < sizeof(*addr)) { | 775 | if (msg->msg_namelen < sizeof(*addr)) { |
| 776 | release_sock(sk); | 776 | release_sock(sk); |
| @@ -842,8 +842,8 @@ static int llcp_sock_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 842 | 842 | ||
| 843 | if (sk->sk_type == SOCK_DGRAM && msg->msg_name) { | 843 | if (sk->sk_type == SOCK_DGRAM && msg->msg_name) { |
| 844 | struct nfc_llcp_ui_cb *ui_cb = nfc_llcp_ui_skb_cb(skb); | 844 | struct nfc_llcp_ui_cb *ui_cb = nfc_llcp_ui_skb_cb(skb); |
| 845 | struct sockaddr_nfc_llcp *sockaddr = | 845 | DECLARE_SOCKADDR(struct sockaddr_nfc_llcp *, sockaddr, |
| 846 | (struct sockaddr_nfc_llcp *) msg->msg_name; | 846 | msg->msg_name); |
| 847 | 847 | ||
| 848 | msg->msg_namelen = sizeof(struct sockaddr_nfc_llcp); | 848 | msg->msg_namelen = sizeof(struct sockaddr_nfc_llcp); |
| 849 | 849 | ||
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 12f2f725a945..d711ecbbb9d3 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
| @@ -1584,7 +1584,7 @@ static int packet_sendmsg_spkt(struct kiocb *iocb, struct socket *sock, | |||
| 1584 | struct msghdr *msg, size_t len) | 1584 | struct msghdr *msg, size_t len) |
| 1585 | { | 1585 | { |
| 1586 | struct sock *sk = sock->sk; | 1586 | struct sock *sk = sock->sk; |
| 1587 | struct sockaddr_pkt *saddr = (struct sockaddr_pkt *)msg->msg_name; | 1587 | DECLARE_SOCKADDR(struct sockaddr_pkt *, saddr, msg->msg_name); |
| 1588 | struct sk_buff *skb = NULL; | 1588 | struct sk_buff *skb = NULL; |
| 1589 | struct net_device *dev; | 1589 | struct net_device *dev; |
| 1590 | __be16 proto = 0; | 1590 | __be16 proto = 0; |
| @@ -2196,7 +2196,7 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg) | |||
| 2196 | __be16 proto; | 2196 | __be16 proto; |
| 2197 | int err, reserve = 0; | 2197 | int err, reserve = 0; |
| 2198 | void *ph; | 2198 | void *ph; |
| 2199 | struct sockaddr_ll *saddr = (struct sockaddr_ll *)msg->msg_name; | 2199 | DECLARE_SOCKADDR(struct sockaddr_ll *, saddr, msg->msg_name); |
| 2200 | bool need_wait = !(msg->msg_flags & MSG_DONTWAIT); | 2200 | bool need_wait = !(msg->msg_flags & MSG_DONTWAIT); |
| 2201 | int tp_len, size_max; | 2201 | int tp_len, size_max; |
| 2202 | unsigned char *addr; | 2202 | unsigned char *addr; |
| @@ -2346,7 +2346,7 @@ static struct sk_buff *packet_alloc_skb(struct sock *sk, size_t prepad, | |||
| 2346 | static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) | 2346 | static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) |
| 2347 | { | 2347 | { |
| 2348 | struct sock *sk = sock->sk; | 2348 | struct sock *sk = sock->sk; |
| 2349 | struct sockaddr_ll *saddr = (struct sockaddr_ll *)msg->msg_name; | 2349 | DECLARE_SOCKADDR(struct sockaddr_ll *, saddr, msg->msg_name); |
| 2350 | struct sk_buff *skb; | 2350 | struct sk_buff *skb; |
| 2351 | struct net_device *dev; | 2351 | struct net_device *dev; |
| 2352 | __be16 proto; | 2352 | __be16 proto; |
| @@ -2922,6 +2922,7 @@ static int packet_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 2922 | * in, we fill it in now. | 2922 | * in, we fill it in now. |
| 2923 | */ | 2923 | */ |
| 2924 | if (sock->type == SOCK_PACKET) { | 2924 | if (sock->type == SOCK_PACKET) { |
| 2925 | __sockaddr_check_size(sizeof(struct sockaddr_pkt)); | ||
| 2925 | msg->msg_namelen = sizeof(struct sockaddr_pkt); | 2926 | msg->msg_namelen = sizeof(struct sockaddr_pkt); |
| 2926 | } else { | 2927 | } else { |
| 2927 | struct sockaddr_ll *sll = &PACKET_SKB_CB(skb)->sa.ll; | 2928 | struct sockaddr_ll *sll = &PACKET_SKB_CB(skb)->sa.ll; |
diff --git a/net/phonet/datagram.c b/net/phonet/datagram.c index 38946b26e471..290352c0e6b4 100644 --- a/net/phonet/datagram.c +++ b/net/phonet/datagram.c | |||
| @@ -86,7 +86,7 @@ static int pn_init(struct sock *sk) | |||
| 86 | static int pn_sendmsg(struct kiocb *iocb, struct sock *sk, | 86 | static int pn_sendmsg(struct kiocb *iocb, struct sock *sk, |
| 87 | struct msghdr *msg, size_t len) | 87 | struct msghdr *msg, size_t len) |
| 88 | { | 88 | { |
| 89 | struct sockaddr_pn *target; | 89 | DECLARE_SOCKADDR(struct sockaddr_pn *, target, msg->msg_name); |
| 90 | struct sk_buff *skb; | 90 | struct sk_buff *skb; |
| 91 | int err; | 91 | int err; |
| 92 | 92 | ||
| @@ -94,13 +94,12 @@ static int pn_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
| 94 | MSG_CMSG_COMPAT)) | 94 | MSG_CMSG_COMPAT)) |
| 95 | return -EOPNOTSUPP; | 95 | return -EOPNOTSUPP; |
| 96 | 96 | ||
| 97 | if (msg->msg_name == NULL) | 97 | if (target == NULL) |
| 98 | return -EDESTADDRREQ; | 98 | return -EDESTADDRREQ; |
| 99 | 99 | ||
| 100 | if (msg->msg_namelen < sizeof(struct sockaddr_pn)) | 100 | if (msg->msg_namelen < sizeof(struct sockaddr_pn)) |
| 101 | return -EINVAL; | 101 | return -EINVAL; |
| 102 | 102 | ||
| 103 | target = (struct sockaddr_pn *)msg->msg_name; | ||
| 104 | if (target->spn_family != AF_PHONET) | 103 | if (target->spn_family != AF_PHONET) |
| 105 | return -EAFNOSUPPORT; | 104 | return -EAFNOSUPPORT; |
| 106 | 105 | ||
| @@ -160,6 +159,7 @@ static int pn_recvmsg(struct kiocb *iocb, struct sock *sk, | |||
| 160 | rval = (flags & MSG_TRUNC) ? skb->len : copylen; | 159 | rval = (flags & MSG_TRUNC) ? skb->len : copylen; |
| 161 | 160 | ||
| 162 | if (msg->msg_name != NULL) { | 161 | if (msg->msg_name != NULL) { |
| 162 | __sockaddr_check_size(sizeof(sa)); | ||
| 163 | memcpy(msg->msg_name, &sa, sizeof(sa)); | 163 | memcpy(msg->msg_name, &sa, sizeof(sa)); |
| 164 | *addr_len = sizeof(sa); | 164 | *addr_len = sizeof(sa); |
| 165 | } | 165 | } |
diff --git a/net/rds/recv.c b/net/rds/recv.c index de339b24ca14..bd82522534fc 100644 --- a/net/rds/recv.c +++ b/net/rds/recv.c | |||
| @@ -402,7 +402,7 @@ int rds_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, | |||
| 402 | struct rds_sock *rs = rds_sk_to_rs(sk); | 402 | struct rds_sock *rs = rds_sk_to_rs(sk); |
| 403 | long timeo; | 403 | long timeo; |
| 404 | int ret = 0, nonblock = msg_flags & MSG_DONTWAIT; | 404 | int ret = 0, nonblock = msg_flags & MSG_DONTWAIT; |
| 405 | struct sockaddr_in *sin; | 405 | DECLARE_SOCKADDR(struct sockaddr_in *, sin, msg->msg_name); |
| 406 | struct rds_incoming *inc = NULL; | 406 | struct rds_incoming *inc = NULL; |
| 407 | 407 | ||
| 408 | /* udp_recvmsg()->sock_recvtimeo() gets away without locking too.. */ | 408 | /* udp_recvmsg()->sock_recvtimeo() gets away without locking too.. */ |
| @@ -479,7 +479,6 @@ int rds_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, | |||
| 479 | 479 | ||
| 480 | rds_stats_inc(s_recv_delivered); | 480 | rds_stats_inc(s_recv_delivered); |
| 481 | 481 | ||
| 482 | sin = (struct sockaddr_in *)msg->msg_name; | ||
| 483 | if (sin) { | 482 | if (sin) { |
| 484 | sin->sin_family = AF_INET; | 483 | sin->sin_family = AF_INET; |
| 485 | sin->sin_port = inc->i_hdr.h_sport; | 484 | sin->sin_port = inc->i_hdr.h_sport; |
diff --git a/net/rds/send.c b/net/rds/send.c index 88eace57dd6b..a82fb660ec00 100644 --- a/net/rds/send.c +++ b/net/rds/send.c | |||
| @@ -922,7 +922,7 @@ int rds_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, | |||
| 922 | { | 922 | { |
| 923 | struct sock *sk = sock->sk; | 923 | struct sock *sk = sock->sk; |
| 924 | struct rds_sock *rs = rds_sk_to_rs(sk); | 924 | struct rds_sock *rs = rds_sk_to_rs(sk); |
| 925 | struct sockaddr_in *usin = (struct sockaddr_in *)msg->msg_name; | 925 | DECLARE_SOCKADDR(struct sockaddr_in *, usin, msg->msg_name); |
| 926 | __be32 daddr; | 926 | __be32 daddr; |
| 927 | __be16 dport; | 927 | __be16 dport; |
| 928 | struct rds_message *rm = NULL; | 928 | struct rds_message *rm = NULL; |
diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c index d080eb4b0d29..c2cca2ee6aef 100644 --- a/net/rose/af_rose.c +++ b/net/rose/af_rose.c | |||
| @@ -1051,7 +1051,7 @@ static int rose_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1051 | { | 1051 | { |
| 1052 | struct sock *sk = sock->sk; | 1052 | struct sock *sk = sock->sk; |
| 1053 | struct rose_sock *rose = rose_sk(sk); | 1053 | struct rose_sock *rose = rose_sk(sk); |
| 1054 | struct sockaddr_rose *usrose = (struct sockaddr_rose *)msg->msg_name; | 1054 | DECLARE_SOCKADDR(struct sockaddr_rose *, usrose, msg->msg_name); |
| 1055 | int err; | 1055 | int err; |
| 1056 | struct full_sockaddr_rose srose; | 1056 | struct full_sockaddr_rose srose; |
| 1057 | struct sk_buff *skb; | 1057 | struct sk_buff *skb; |
| @@ -1253,7 +1253,8 @@ static int rose_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1253 | 1253 | ||
| 1254 | if (msg->msg_name) { | 1254 | if (msg->msg_name) { |
| 1255 | struct sockaddr_rose *srose; | 1255 | struct sockaddr_rose *srose; |
| 1256 | struct full_sockaddr_rose *full_srose = msg->msg_name; | 1256 | DECLARE_SOCKADDR(struct full_sockaddr_rose *, full_srose, |
| 1257 | msg->msg_name); | ||
| 1257 | 1258 | ||
| 1258 | memset(msg->msg_name, 0, sizeof(struct full_sockaddr_rose)); | 1259 | memset(msg->msg_name, 0, sizeof(struct full_sockaddr_rose)); |
| 1259 | srose = msg->msg_name; | 1260 | srose = msg->msg_name; |
diff --git a/net/rxrpc/ar-output.c b/net/rxrpc/ar-output.c index e1ac183d50bb..d0e8f1c1898a 100644 --- a/net/rxrpc/ar-output.c +++ b/net/rxrpc/ar-output.c | |||
| @@ -152,8 +152,8 @@ int rxrpc_client_sendmsg(struct kiocb *iocb, struct rxrpc_sock *rx, | |||
| 152 | if (trans) { | 152 | if (trans) { |
| 153 | service_id = rx->service_id; | 153 | service_id = rx->service_id; |
| 154 | if (msg->msg_name) { | 154 | if (msg->msg_name) { |
| 155 | struct sockaddr_rxrpc *srx = | 155 | DECLARE_SOCKADDR(struct sockaddr_rxrpc *, srx, |
| 156 | (struct sockaddr_rxrpc *) msg->msg_name; | 156 | msg->msg_name); |
| 157 | service_id = htons(srx->srx_service); | 157 | service_id = htons(srx->srx_service); |
| 158 | } | 158 | } |
| 159 | key = rx->key; | 159 | key = rx->key; |
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index eab17eb9ca1d..aab4948f0aff 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
| @@ -608,7 +608,7 @@ static int send_msg(struct kiocb *iocb, struct socket *sock, | |||
| 608 | { | 608 | { |
| 609 | struct sock *sk = sock->sk; | 609 | struct sock *sk = sock->sk; |
| 610 | struct tipc_port *tport = tipc_sk_port(sk); | 610 | struct tipc_port *tport = tipc_sk_port(sk); |
| 611 | struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name; | 611 | DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name); |
| 612 | int needs_conn; | 612 | int needs_conn; |
| 613 | long timeo; | 613 | long timeo; |
| 614 | int res = -EINVAL; | 614 | int res = -EINVAL; |
| @@ -736,7 +736,7 @@ static int send_packet(struct kiocb *iocb, struct socket *sock, | |||
| 736 | { | 736 | { |
| 737 | struct sock *sk = sock->sk; | 737 | struct sock *sk = sock->sk; |
| 738 | struct tipc_port *tport = tipc_sk_port(sk); | 738 | struct tipc_port *tport = tipc_sk_port(sk); |
| 739 | struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name; | 739 | DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name); |
| 740 | int res = -EINVAL; | 740 | int res = -EINVAL; |
| 741 | long timeo; | 741 | long timeo; |
| 742 | 742 | ||
| @@ -906,7 +906,7 @@ static int auto_connect(struct socket *sock, struct tipc_msg *msg) | |||
| 906 | */ | 906 | */ |
| 907 | static void set_orig_addr(struct msghdr *m, struct tipc_msg *msg) | 907 | static void set_orig_addr(struct msghdr *m, struct tipc_msg *msg) |
| 908 | { | 908 | { |
| 909 | struct sockaddr_tipc *addr = (struct sockaddr_tipc *)m->msg_name; | 909 | DECLARE_SOCKADDR(struct sockaddr_tipc *, addr, m->msg_name); |
| 910 | 910 | ||
| 911 | if (addr) { | 911 | if (addr) { |
| 912 | addr->family = AF_TIPC; | 912 | addr->family = AF_TIPC; |
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 800ca61758ff..29fc8bee9702 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
| @@ -1450,7 +1450,7 @@ static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock, | |||
| 1450 | struct sock *sk = sock->sk; | 1450 | struct sock *sk = sock->sk; |
| 1451 | struct net *net = sock_net(sk); | 1451 | struct net *net = sock_net(sk); |
| 1452 | struct unix_sock *u = unix_sk(sk); | 1452 | struct unix_sock *u = unix_sk(sk); |
| 1453 | struct sockaddr_un *sunaddr = msg->msg_name; | 1453 | DECLARE_SOCKADDR(struct sockaddr_un *, sunaddr, msg->msg_name); |
| 1454 | struct sock *other = NULL; | 1454 | struct sock *other = NULL; |
| 1455 | int namelen = 0; /* fake GCC */ | 1455 | int namelen = 0; /* fake GCC */ |
| 1456 | int err; | 1456 | int err; |
| @@ -1912,7 +1912,7 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1912 | struct scm_cookie tmp_scm; | 1912 | struct scm_cookie tmp_scm; |
| 1913 | struct sock *sk = sock->sk; | 1913 | struct sock *sk = sock->sk; |
| 1914 | struct unix_sock *u = unix_sk(sk); | 1914 | struct unix_sock *u = unix_sk(sk); |
| 1915 | struct sockaddr_un *sunaddr = msg->msg_name; | 1915 | DECLARE_SOCKADDR(struct sockaddr_un *, sunaddr, msg->msg_name); |
| 1916 | int copied = 0; | 1916 | int copied = 0; |
| 1917 | int check_creds = 0; | 1917 | int check_creds = 0; |
| 1918 | int target; | 1918 | int target; |
diff --git a/net/vmw_vsock/vmci_transport.c b/net/vmw_vsock/vmci_transport.c index 687360da62d9..9bb63ffec4f2 100644 --- a/net/vmw_vsock/vmci_transport.c +++ b/net/vmw_vsock/vmci_transport.c | |||
| @@ -1779,10 +1779,8 @@ static int vmci_transport_dgram_dequeue(struct kiocb *kiocb, | |||
| 1779 | goto out; | 1779 | goto out; |
| 1780 | 1780 | ||
| 1781 | if (msg->msg_name) { | 1781 | if (msg->msg_name) { |
| 1782 | struct sockaddr_vm *vm_addr; | ||
| 1783 | |||
| 1784 | /* Provide the address of the sender. */ | 1782 | /* Provide the address of the sender. */ |
| 1785 | vm_addr = (struct sockaddr_vm *)msg->msg_name; | 1783 | DECLARE_SOCKADDR(struct sockaddr_vm *, vm_addr, msg->msg_name); |
| 1786 | vsock_addr_init(vm_addr, dg->src.context, dg->src.resource); | 1784 | vsock_addr_init(vm_addr, dg->src.context, dg->src.resource); |
| 1787 | msg->msg_namelen = sizeof(*vm_addr); | 1785 | msg->msg_namelen = sizeof(*vm_addr); |
| 1788 | } | 1786 | } |
diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c index c8a8297cd4b8..6177479c7de9 100644 --- a/net/x25/af_x25.c +++ b/net/x25/af_x25.c | |||
| @@ -1082,7 +1082,7 @@ static int x25_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1082 | { | 1082 | { |
| 1083 | struct sock *sk = sock->sk; | 1083 | struct sock *sk = sock->sk; |
| 1084 | struct x25_sock *x25 = x25_sk(sk); | 1084 | struct x25_sock *x25 = x25_sk(sk); |
| 1085 | struct sockaddr_x25 *usx25 = (struct sockaddr_x25 *)msg->msg_name; | 1085 | DECLARE_SOCKADDR(struct sockaddr_x25 *, usx25, msg->msg_name); |
| 1086 | struct sockaddr_x25 sx25; | 1086 | struct sockaddr_x25 sx25; |
| 1087 | struct sk_buff *skb; | 1087 | struct sk_buff *skb; |
| 1088 | unsigned char *asmptr; | 1088 | unsigned char *asmptr; |
| @@ -1258,7 +1258,7 @@ static int x25_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1258 | { | 1258 | { |
| 1259 | struct sock *sk = sock->sk; | 1259 | struct sock *sk = sock->sk; |
| 1260 | struct x25_sock *x25 = x25_sk(sk); | 1260 | struct x25_sock *x25 = x25_sk(sk); |
| 1261 | struct sockaddr_x25 *sx25 = (struct sockaddr_x25 *)msg->msg_name; | 1261 | DECLARE_SOCKADDR(struct sockaddr_x25 *, sx25, msg->msg_name); |
| 1262 | size_t copied; | 1262 | size_t copied; |
| 1263 | int qbit, header_len; | 1263 | int qbit, header_len; |
| 1264 | struct sk_buff *skb; | 1264 | struct sk_buff *skb; |
