aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteffen Hurrle <steffen@hurrle.net>2014-01-17 16:53:15 -0500
committerDavid S. Miller <davem@davemloft.net>2014-01-19 02:04:16 -0500
commit342dfc306fb32155314dad277f3c3686b83fb9f1 (patch)
treea0d220f9310725c72bac70945261c9282e7cf305
parentea02f9411d9faa3553ed09ce0ec9f00ceae9885e (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>
-rw-r--r--drivers/isdn/mISDN/socket.c5
-rw-r--r--net/appletalk/ddp.c4
-rw-r--r--net/ax25/af_ax25.c4
-rw-r--r--net/bluetooth/l2cap_sock.c2
-rw-r--r--net/can/bcm.c4
-rw-r--r--net/can/raw.c4
-rw-r--r--net/decnet/af_decnet.c3
-rw-r--r--net/ieee802154/dgram.c4
-rw-r--r--net/ipv4/ip_sockglue.c3
-rw-r--r--net/ipv4/ping.c7
-rw-r--r--net/ipv4/raw.c4
-rw-r--r--net/ipv4/udp.c4
-rw-r--r--net/ipv6/datagram.c6
-rw-r--r--net/ipv6/ping.c2
-rw-r--r--net/ipv6/raw.c4
-rw-r--r--net/ipv6/udp.c6
-rw-r--r--net/ipx/af_ipx.c4
-rw-r--r--net/irda/af_irda.c2
-rw-r--r--net/l2tp/l2tp_ip.c4
-rw-r--r--net/l2tp/l2tp_ip6.c5
-rw-r--r--net/llc/af_llc.c4
-rw-r--r--net/netlink/af_netlink.c4
-rw-r--r--net/netrom/af_netrom.c4
-rw-r--r--net/nfc/llcp_sock.c8
-rw-r--r--net/packet/af_packet.c7
-rw-r--r--net/phonet/datagram.c6
-rw-r--r--net/rds/recv.c3
-rw-r--r--net/rds/send.c2
-rw-r--r--net/rose/af_rose.c5
-rw-r--r--net/rxrpc/ar-output.c4
-rw-r--r--net/tipc/socket.c6
-rw-r--r--net/unix/af_unix.c4
-rw-r--r--net/vmw_vsock/vmci_transport.c4
-rw-r--r--net/x25/af_x25.c4
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:
1435static int ax25_sendmsg(struct kiocb *iocb, struct socket *sock, 1435static 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)
1413static void l2cap_skb_msg_name(struct sk_buff *skb, void *msg_name, 1413static 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:
707static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock, 707static 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,
2346static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) 2346static 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)
86static int pn_sendmsg(struct kiocb *iocb, struct sock *sk, 86static 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 */
907static void set_orig_addr(struct msghdr *m, struct tipc_msg *msg) 907static 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;