return err;
 
        if (msg->msg_name) {
-               struct sockaddr_mISDN *maddr = msg->msg_name;
+               DECLARE_SOCKADDR(struct sockaddr_mISDN *, maddr, msg->msg_name);
 
                maddr->family = AF_ISDN;
                maddr->dev = _pms(sk)->dev->id;
        struct sock             *sk = sock->sk;
        struct sk_buff          *skb;
        int                     err = -ENOMEM;
-       struct sockaddr_mISDN   *maddr;
 
        if (*debug & DEBUG_SOCKET)
                printk(KERN_DEBUG "%s: len %d flags %x ch %d proto %x\n",
 
        if (msg->msg_namelen >= sizeof(struct sockaddr_mISDN)) {
                /* if we have a address, we use it */
-               maddr = (struct sockaddr_mISDN *)msg->msg_name;
+               DECLARE_SOCKADDR(struct sockaddr_mISDN *, maddr, msg->msg_name);
                mISDN_HEAD_ID(skb) = maddr->channel;
        } else { /* use default for L2 messages */
                if ((sk->sk_protocol == ISDN_P_LAPD_TE) ||
 
 {
        struct sock *sk = sock->sk;
        struct atalk_sock *at = at_sk(sk);
-       struct sockaddr_at *usat = (struct sockaddr_at *)msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_at *, usat, msg->msg_name);
        int flags = msg->msg_flags;
        int loopback = 0;
        struct sockaddr_at local_satalk, gsat;
        err = skb_copy_datagram_iovec(skb, offset, msg->msg_iov, copied);
 
        if (!err && msg->msg_name) {
-               struct sockaddr_at *sat = msg->msg_name;
+               DECLARE_SOCKADDR(struct sockaddr_at *, sat, msg->msg_name);
                sat->sat_family      = AF_APPLETALK;
                sat->sat_port        = ddp->deh_sport;
                sat->sat_addr.s_node = ddp->deh_snode;
 
 static int ax25_sendmsg(struct kiocb *iocb, struct socket *sock,
                        struct msghdr *msg, size_t len)
 {
-       struct sockaddr_ax25 *usax = (struct sockaddr_ax25 *)msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_ax25 *, usax, msg->msg_name);
        struct sock *sk = sock->sk;
        struct sockaddr_ax25 sax;
        struct sk_buff *skb;
                ax25_digi digi;
                ax25_address src;
                const unsigned char *mac = skb_mac_header(skb);
-               struct sockaddr_ax25 *sax = msg->msg_name;
+               DECLARE_SOCKADDR(struct sockaddr_ax25 *, sax, msg->msg_name);
 
                memset(sax, 0, sizeof(struct full_sockaddr_ax25));
                ax25_addr_parse(mac + 1, skb->data - mac - 1, &src, NULL,
 
 static void l2cap_skb_msg_name(struct sk_buff *skb, void *msg_name,
                               int *msg_namelen)
 {
-       struct sockaddr_l2 *la = (struct sockaddr_l2 *) msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_l2 *, la, msg_name);
 
        memset(la, 0, sizeof(struct sockaddr_l2));
        la->l2_family = AF_BLUETOOTH;
 
 
        if (!ifindex && msg->msg_name) {
                /* no bound device as default => check msg_name */
-               struct sockaddr_can *addr =
-                       (struct sockaddr_can *)msg->msg_name;
+               DECLARE_SOCKADDR(struct sockaddr_can *, addr, msg->msg_name);
 
                if (msg->msg_namelen < sizeof(*addr))
                        return -EINVAL;
        sock_recv_ts_and_drops(msg, sk, skb);
 
        if (msg->msg_name) {
+               __sockaddr_check_size(sizeof(struct sockaddr_can));
                msg->msg_namelen = sizeof(struct sockaddr_can);
                memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
        }
 
        int err;
 
        if (msg->msg_name) {
-               struct sockaddr_can *addr =
-                       (struct sockaddr_can *)msg->msg_name;
+               DECLARE_SOCKADDR(struct sockaddr_can *, addr, msg->msg_name);
 
                if (msg->msg_namelen < sizeof(*addr))
                        return -EINVAL;
        sock_recv_ts_and_drops(msg, sk, skb);
 
        if (msg->msg_name) {
+               __sockaddr_check_size(sizeof(struct sockaddr_can));
                msg->msg_namelen = sizeof(struct sockaddr_can);
                memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
        }
 
                rv = (flags & MSG_PEEK) ? -sk->sk_err : sock_error(sk);
 
        if ((rv >= 0) && msg->msg_name) {
+               __sockaddr_check_size(sizeof(struct sockaddr_dn));
                memcpy(msg->msg_name, &scp->peer, sizeof(struct sockaddr_dn));
                msg->msg_namelen = sizeof(struct sockaddr_dn);
        }
        int err = 0;
        size_t sent = 0;
        int addr_len = msg->msg_namelen;
-       struct sockaddr_dn *addr = (struct sockaddr_dn *)msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_dn *, addr, msg->msg_name);
        struct sk_buff *skb = NULL;
        struct dn_skb_cb *cb;
        size_t len;
 
        size_t copied = 0;
        int err = -EOPNOTSUPP;
        struct sk_buff *skb;
-       struct sockaddr_ieee802154 *saddr;
-
-       saddr = (struct sockaddr_ieee802154 *)msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_ieee802154 *, saddr, msg->msg_name);
 
        skb = skb_recv_datagram(sk, flags, noblock, &err);
        if (!skb)
 
 {
        struct sock_exterr_skb *serr;
        struct sk_buff *skb, *skb2;
-       struct sockaddr_in *sin;
+       DECLARE_SOCKADDR(struct sockaddr_in *, sin, msg->msg_name);
        struct {
                struct sock_extended_err ee;
                struct sockaddr_in       offender;
 
        serr = SKB_EXT_ERR(skb);
 
-       sin = (struct sockaddr_in *)msg->msg_name;
        if (sin) {
                sin->sin_family = AF_INET;
                sin->sin_addr.s_addr = *(__be32 *)(skb_network_header(skb) +
 
         */
 
        if (msg->msg_name) {
-               struct sockaddr_in *usin = (struct sockaddr_in *)msg->msg_name;
+               DECLARE_SOCKADDR(struct sockaddr_in *, usin, msg->msg_name);
                if (msg->msg_namelen < sizeof(*usin))
                        return -EINVAL;
                if (usin->sin_family != AF_INET)
 
        /* Copy the address and add cmsg data. */
        if (family == AF_INET) {
-               struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name;
+               DECLARE_SOCKADDR(struct sockaddr_in *, sin, msg->msg_name);
 
                if (sin) {
                        sin->sin_family = AF_INET;
        } else if (family == AF_INET6) {
                struct ipv6_pinfo *np = inet6_sk(sk);
                struct ipv6hdr *ip6 = ipv6_hdr(skb);
-               struct sockaddr_in6 *sin6 =
-                       (struct sockaddr_in6 *)msg->msg_name;
+               DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, msg->msg_name);
 
                if (sin6) {
                        sin6->sin6_family = AF_INET6;
 
         */
 
        if (msg->msg_namelen) {
-               struct sockaddr_in *usin = (struct sockaddr_in *)msg->msg_name;
+               DECLARE_SOCKADDR(struct sockaddr_in *, usin, msg->msg_name);
                err = -EINVAL;
                if (msg->msg_namelen < sizeof(*usin))
                        goto out;
        struct inet_sock *inet = inet_sk(sk);
        size_t copied = 0;
        int err = -EOPNOTSUPP;
-       struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_in *, sin, msg->msg_name);
        struct sk_buff *skb;
 
        if (flags & MSG_OOB)
 
         *      Get and verify the address.
         */
        if (msg->msg_name) {
-               struct sockaddr_in *usin = (struct sockaddr_in *)msg->msg_name;
+               DECLARE_SOCKADDR(struct sockaddr_in *, usin, msg->msg_name);
                if (msg->msg_namelen < sizeof(*usin))
                        return -EINVAL;
                if (usin->sin_family != AF_INET) {
                size_t len, int noblock, int flags, int *addr_len)
 {
        struct inet_sock *inet = inet_sk(sk);
-       struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_in *, sin, msg->msg_name);
        struct sk_buff *skb;
        unsigned int ulen, copied;
        int peeked, off = 0;
 
        struct ipv6_pinfo *np = inet6_sk(sk);
        struct sock_exterr_skb *serr;
        struct sk_buff *skb, *skb2;
-       struct sockaddr_in6 *sin;
+       DECLARE_SOCKADDR(struct sockaddr_in6 *, sin, msg->msg_name);
        struct {
                struct sock_extended_err ee;
                struct sockaddr_in6      offender;
 
        serr = SKB_EXT_ERR(skb);
 
-       sin = (struct sockaddr_in6 *)msg->msg_name;
        if (sin) {
                const unsigned char *nh = skb_network_header(skb);
                sin->sin6_family = AF_INET6;
 {
        struct ipv6_pinfo *np = inet6_sk(sk);
        struct sk_buff *skb;
-       struct sockaddr_in6 *sin;
        struct ip6_mtuinfo mtu_info;
+       DECLARE_SOCKADDR(struct sockaddr_in6 *, sin, msg->msg_name);
        int err;
        int copied;
 
 
        memcpy(&mtu_info, IP6CBMTU(skb), sizeof(mtu_info));
 
-       sin = (struct sockaddr_in6 *)msg->msg_name;
        if (sin) {
                sin->sin6_family = AF_INET6;
                sin->sin6_flowinfo = 0;
 
                return err;
 
        if (msg->msg_name) {
-               struct sockaddr_in6 *u = (struct sockaddr_in6 *) msg->msg_name;
+               DECLARE_SOCKADDR(struct sockaddr_in6 *, u, msg->msg_name);
                if (msg->msg_namelen < sizeof(struct sockaddr_in6) ||
                    u->sin6_family != AF_INET6) {
                        return -EINVAL;
 
                  int noblock, int flags, int *addr_len)
 {
        struct ipv6_pinfo *np = inet6_sk(sk);
-       struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, msg->msg_name);
        struct sk_buff *skb;
        size_t copied;
        int err;
                   struct msghdr *msg, size_t len)
 {
        struct ipv6_txoptions opt_space;
-       struct sockaddr_in6 * sin6 = (struct sockaddr_in6 *) msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, msg->msg_name);
        struct in6_addr *daddr, *final_p, final;
        struct inet_sock *inet = inet_sk(sk);
        struct ipv6_pinfo *np = inet6_sk(sk);
 
 
        /* Copy the address. */
        if (msg->msg_name) {
-               struct sockaddr_in6 *sin6;
-
-               sin6 = (struct sockaddr_in6 *) msg->msg_name;
+               DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, msg->msg_name);
                sin6->sin6_family = AF_INET6;
                sin6->sin6_port = udp_hdr(skb)->source;
                sin6->sin6_flowinfo = 0;
        struct udp_sock *up = udp_sk(sk);
        struct inet_sock *inet = inet_sk(sk);
        struct ipv6_pinfo *np = inet6_sk(sk);
-       struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, msg->msg_name);
        struct in6_addr *daddr, *final_p, final;
        struct ipv6_txoptions *opt = NULL;
        struct ip6_flowlabel *flowlabel = NULL;
 
 {
        struct sock *sk = sock->sk;
        struct ipx_sock *ipxs = ipx_sk(sk);
-       struct sockaddr_ipx *usipx = (struct sockaddr_ipx *)msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_ipx *, usipx, msg->msg_name);
        struct sockaddr_ipx local_sipx;
        int rc = -EINVAL;
        int flags = msg->msg_flags;
 {
        struct sock *sk = sock->sk;
        struct ipx_sock *ipxs = ipx_sk(sk);
-       struct sockaddr_ipx *sipx = (struct sockaddr_ipx *)msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_ipx *, sipx, msg->msg_name);
        struct ipxhdr *ipx = NULL;
        struct sk_buff *skb;
        int copied, rc;
 
 
        /* Check if an address was specified with sendto. Jean II */
        if (msg->msg_name) {
-               struct sockaddr_irda *addr = (struct sockaddr_irda *) msg->msg_name;
+               DECLARE_SOCKADDR(struct sockaddr_irda *, addr, msg->msg_name);
                err = -EINVAL;
                /* Check address, extract pid. Jean II */
                if (msg->msg_namelen < sizeof(*addr))
 
 
        /* Get and verify the address. */
        if (msg->msg_name) {
-               struct sockaddr_l2tpip *lip = (struct sockaddr_l2tpip *) msg->msg_name;
+               DECLARE_SOCKADDR(struct sockaddr_l2tpip *, lip, msg->msg_name);
                rc = -EINVAL;
                if (msg->msg_namelen < sizeof(*lip))
                        goto out;
        struct inet_sock *inet = inet_sk(sk);
        size_t copied = 0;
        int err = -EOPNOTSUPP;
-       struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_in *, sin, msg->msg_name);
        struct sk_buff *skb;
 
        if (flags & MSG_OOB)
 
                            struct msghdr *msg, size_t len)
 {
        struct ipv6_txoptions opt_space;
-       struct sockaddr_l2tpip6 *lsa =
-               (struct sockaddr_l2tpip6 *) msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_l2tpip6 *, lsa, msg->msg_name);
        struct in6_addr *daddr, *final_p, final;
        struct ipv6_pinfo *np = inet6_sk(sk);
        struct ipv6_txoptions *opt = NULL;
                            int flags, int *addr_len)
 {
        struct ipv6_pinfo *np = inet6_sk(sk);
-       struct sockaddr_l2tpip6 *lsa = (struct sockaddr_l2tpip6 *)msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_l2tpip6 *, lsa, msg->msg_name);
        size_t copied = 0;
        int err = -EOPNOTSUPP;
        struct sk_buff *skb;
 
 static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock,
                          struct msghdr *msg, size_t len, int flags)
 {
-       struct sockaddr_llc *uaddr = (struct sockaddr_llc *)msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_llc *, uaddr, msg->msg_name);
        const int nonblock = flags & MSG_DONTWAIT;
        struct sk_buff *skb = NULL;
        struct sock *sk = sock->sk;
 {
        struct sock *sk = sock->sk;
        struct llc_sock *llc = llc_sk(sk);
-       struct sockaddr_llc *addr = (struct sockaddr_llc *)msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_llc *, addr, msg->msg_name);
        int flags = msg->msg_flags;
        int noblock = flags & MSG_DONTWAIT;
        struct sk_buff *skb;
 
        struct sock_iocb *siocb = kiocb_to_siocb(kiocb);
        struct sock *sk = sock->sk;
        struct netlink_sock *nlk = nlk_sk(sk);
-       struct sockaddr_nl *addr = msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_nl *, addr, msg->msg_name);
        u32 dst_portid;
        u32 dst_group;
        struct sk_buff *skb;
        err = skb_copy_datagram_iovec(data_skb, 0, msg->msg_iov, copied);
 
        if (msg->msg_name) {
-               struct sockaddr_nl *addr = (struct sockaddr_nl *)msg->msg_name;
+               DECLARE_SOCKADDR(struct sockaddr_nl *, addr, msg->msg_name);
                addr->nl_family = AF_NETLINK;
                addr->nl_pad    = 0;
                addr->nl_pid    = NETLINK_CB(skb).portid;
 
 {
        struct sock *sk = sock->sk;
        struct nr_sock *nr = nr_sk(sk);
-       struct sockaddr_ax25 *usax = (struct sockaddr_ax25 *)msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_ax25 *, usax, msg->msg_name);
        int err;
        struct sockaddr_ax25 sax;
        struct sk_buff *skb;
                      struct msghdr *msg, size_t size, int flags)
 {
        struct sock *sk = sock->sk;
-       struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_ax25 *, sax, msg->msg_name);
        size_t copied;
        struct sk_buff *skb;
        int er;
 
        lock_sock(sk);
 
        if (sk->sk_type == SOCK_DGRAM) {
-               struct sockaddr_nfc_llcp *addr =
-                       (struct sockaddr_nfc_llcp *)msg->msg_name;
+               DECLARE_SOCKADDR(struct sockaddr_nfc_llcp *, addr,
+                                msg->msg_name);
 
                if (msg->msg_namelen < sizeof(*addr)) {
                        release_sock(sk);
 
        if (sk->sk_type == SOCK_DGRAM && msg->msg_name) {
                struct nfc_llcp_ui_cb *ui_cb = nfc_llcp_ui_skb_cb(skb);
-               struct sockaddr_nfc_llcp *sockaddr =
-                       (struct sockaddr_nfc_llcp *) msg->msg_name;
+               DECLARE_SOCKADDR(struct sockaddr_nfc_llcp *, sockaddr,
+                                msg->msg_name);
 
                msg->msg_namelen = sizeof(struct sockaddr_nfc_llcp);
 
 
                               struct msghdr *msg, size_t len)
 {
        struct sock *sk = sock->sk;
-       struct sockaddr_pkt *saddr = (struct sockaddr_pkt *)msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_pkt *, saddr, msg->msg_name);
        struct sk_buff *skb = NULL;
        struct net_device *dev;
        __be16 proto = 0;
        __be16 proto;
        int err, reserve = 0;
        void *ph;
-       struct sockaddr_ll *saddr = (struct sockaddr_ll *)msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_ll *, saddr, msg->msg_name);
        bool need_wait = !(msg->msg_flags & MSG_DONTWAIT);
        int tp_len, size_max;
        unsigned char *addr;
 static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
 {
        struct sock *sk = sock->sk;
-       struct sockaddr_ll *saddr = (struct sockaddr_ll *)msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_ll *, saddr, msg->msg_name);
        struct sk_buff *skb;
        struct net_device *dev;
        __be16 proto;
                 * in, we fill it in now.
                 */
                if (sock->type == SOCK_PACKET) {
+                       __sockaddr_check_size(sizeof(struct sockaddr_pkt));
                        msg->msg_namelen = sizeof(struct sockaddr_pkt);
                } else {
                        struct sockaddr_ll *sll = &PACKET_SKB_CB(skb)->sa.ll;
 
 static int pn_sendmsg(struct kiocb *iocb, struct sock *sk,
                        struct msghdr *msg, size_t len)
 {
-       struct sockaddr_pn *target;
+       DECLARE_SOCKADDR(struct sockaddr_pn *, target, msg->msg_name);
        struct sk_buff *skb;
        int err;
 
                                MSG_CMSG_COMPAT))
                return -EOPNOTSUPP;
 
-       if (msg->msg_name == NULL)
+       if (target == NULL)
                return -EDESTADDRREQ;
 
        if (msg->msg_namelen < sizeof(struct sockaddr_pn))
                return -EINVAL;
 
-       target = (struct sockaddr_pn *)msg->msg_name;
        if (target->spn_family != AF_PHONET)
                return -EAFNOSUPPORT;
 
        rval = (flags & MSG_TRUNC) ? skb->len : copylen;
 
        if (msg->msg_name != NULL) {
+               __sockaddr_check_size(sizeof(sa));
                memcpy(msg->msg_name, &sa, sizeof(sa));
                *addr_len = sizeof(sa);
        }
 
        struct rds_sock *rs = rds_sk_to_rs(sk);
        long timeo;
        int ret = 0, nonblock = msg_flags & MSG_DONTWAIT;
-       struct sockaddr_in *sin;
+       DECLARE_SOCKADDR(struct sockaddr_in *, sin, msg->msg_name);
        struct rds_incoming *inc = NULL;
 
        /* udp_recvmsg()->sock_recvtimeo() gets away without locking too.. */
 
                rds_stats_inc(s_recv_delivered);
 
-               sin = (struct sockaddr_in *)msg->msg_name;
                if (sin) {
                        sin->sin_family = AF_INET;
                        sin->sin_port = inc->i_hdr.h_sport;
 
 {
        struct sock *sk = sock->sk;
        struct rds_sock *rs = rds_sk_to_rs(sk);
-       struct sockaddr_in *usin = (struct sockaddr_in *)msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_in *, usin, msg->msg_name);
        __be32 daddr;
        __be16 dport;
        struct rds_message *rm = NULL;
 
 {
        struct sock *sk = sock->sk;
        struct rose_sock *rose = rose_sk(sk);
-       struct sockaddr_rose *usrose = (struct sockaddr_rose *)msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_rose *, usrose, msg->msg_name);
        int err;
        struct full_sockaddr_rose srose;
        struct sk_buff *skb;
 
        if (msg->msg_name) {
                struct sockaddr_rose *srose;
-               struct full_sockaddr_rose *full_srose = msg->msg_name;
+               DECLARE_SOCKADDR(struct full_sockaddr_rose *, full_srose,
+                                msg->msg_name);
 
                memset(msg->msg_name, 0, sizeof(struct full_sockaddr_rose));
                srose = msg->msg_name;
 
        if (trans) {
                service_id = rx->service_id;
                if (msg->msg_name) {
-                       struct sockaddr_rxrpc *srx =
-                               (struct sockaddr_rxrpc *) msg->msg_name;
+                       DECLARE_SOCKADDR(struct sockaddr_rxrpc *, srx,
+                                        msg->msg_name);
                        service_id = htons(srx->srx_service);
                }
                key = rx->key;
 
 {
        struct sock *sk = sock->sk;
        struct tipc_port *tport = tipc_sk_port(sk);
-       struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name);
        int needs_conn;
        long timeo;
        int res = -EINVAL;
 {
        struct sock *sk = sock->sk;
        struct tipc_port *tport = tipc_sk_port(sk);
-       struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name);
        int res = -EINVAL;
        long timeo;
 
  */
 static void set_orig_addr(struct msghdr *m, struct tipc_msg *msg)
 {
-       struct sockaddr_tipc *addr = (struct sockaddr_tipc *)m->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_tipc *, addr, m->msg_name);
 
        if (addr) {
                addr->family = AF_TIPC;
 
        struct sock *sk = sock->sk;
        struct net *net = sock_net(sk);
        struct unix_sock *u = unix_sk(sk);
-       struct sockaddr_un *sunaddr = msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_un *, sunaddr, msg->msg_name);
        struct sock *other = NULL;
        int namelen = 0; /* fake GCC */
        int err;
        struct scm_cookie tmp_scm;
        struct sock *sk = sock->sk;
        struct unix_sock *u = unix_sk(sk);
-       struct sockaddr_un *sunaddr = msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_un *, sunaddr, msg->msg_name);
        int copied = 0;
        int check_creds = 0;
        int target;
 
                goto out;
 
        if (msg->msg_name) {
-               struct sockaddr_vm *vm_addr;
-
                /* Provide the address of the sender. */
-               vm_addr = (struct sockaddr_vm *)msg->msg_name;
+               DECLARE_SOCKADDR(struct sockaddr_vm *, vm_addr, msg->msg_name);
                vsock_addr_init(vm_addr, dg->src.context, dg->src.resource);
                msg->msg_namelen = sizeof(*vm_addr);
        }
 
 {
        struct sock *sk = sock->sk;
        struct x25_sock *x25 = x25_sk(sk);
-       struct sockaddr_x25 *usx25 = (struct sockaddr_x25 *)msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_x25 *, usx25, msg->msg_name);
        struct sockaddr_x25 sx25;
        struct sk_buff *skb;
        unsigned char *asmptr;
 {
        struct sock *sk = sock->sk;
        struct x25_sock *x25 = x25_sk(sk);
-       struct sockaddr_x25 *sx25 = (struct sockaddr_x25 *)msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_x25 *, sx25, msg->msg_name);
        size_t copied;
        int qbit, header_len;
        struct sk_buff *skb;