{
if (copy_from_user(kmsg, umsg, sizeof(struct msghdr)))
return -EFAULT;
- if (kmsg->msg_namelen > sizeof(struct sockaddr_storage))
+
+ if (kmsg->msg_name == NULL)
+ kmsg->msg_namelen = 0;
+
+ if (kmsg->msg_namelen < 0)
return -EINVAL;
+
+ if (kmsg->msg_namelen > sizeof(struct sockaddr_storage))
+ kmsg->msg_namelen = sizeof(struct sockaddr_storage);
return 0;
}
int err, ctl_len, iov_size, total_len;
err = -EFAULT;
- if (MSG_CMSG_COMPAT & flags) {
- if (get_compat_msghdr(msg_sys, msg_compat))
- return -EFAULT;
- } else {
+ if (MSG_CMSG_COMPAT & flags)
+ err = get_compat_msghdr(msg_sys, msg_compat);
+ else
err = copy_msghdr_from_user(msg_sys, msg);
- if (err)
- return err;
- }
+ if (err)
+ return err;
/* do not move before msg_sys is valid */
err = -EMSGSIZE;
struct sockaddr __user *uaddr;
int __user *uaddr_len;
- if (MSG_CMSG_COMPAT & flags) {
- if (get_compat_msghdr(msg_sys, msg_compat))
- return -EFAULT;
- } else {
+ if (MSG_CMSG_COMPAT & flags)
+ err = get_compat_msghdr(msg_sys, msg_compat);
+ else
err = copy_msghdr_from_user(msg_sys, msg);
- if (err)
- return err;
- }
+ if (err)
+ return err;
err = -EMSGSIZE;
if (msg_sys->msg_iovlen > UIO_MAXIOV)