]> Pileus Git - ~andy/linux/blobdiff - net/phonet/datagram.c
net: add build-time checks for msg->msg_name size
[~andy/linux] / net / phonet / datagram.c
index 38946b26e471c9754c922d3451e8ec2682f5ae3d..290352c0e6b476c894bd33928c4bca6d9c862aae 100644 (file)
@@ -86,7 +86,7 @@ static int pn_init(struct sock *sk)
 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;
 
@@ -94,13 +94,12 @@ static int pn_sendmsg(struct kiocb *iocb, struct sock *sk,
                                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;
 
@@ -160,6 +159,7 @@ static int pn_recvmsg(struct kiocb *iocb, struct sock *sk,
        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);
        }