Changeset View
Changeset View
Standalone View
Standalone View
head/sys/compat/linux/linux_socket.c
Show First 20 Lines • Show All 1,190 Lines • ▼ Show 20 Lines | #ifdef COMPAT_LINUX32 | ||||
error = linux32_copyiniov(PTRIN(msg->msg_iov), msg->msg_iovlen, | error = linux32_copyiniov(PTRIN(msg->msg_iov), msg->msg_iovlen, | ||||
&iov, EMSGSIZE); | &iov, EMSGSIZE); | ||||
#else | #else | ||||
error = copyiniov(msg->msg_iov, msg->msg_iovlen, &iov, EMSGSIZE); | error = copyiniov(msg->msg_iov, msg->msg_iovlen, &iov, EMSGSIZE); | ||||
#endif | #endif | ||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
if (msg->msg_name) { | if (msg->msg_name != NULL && msg->msg_namelen > 0) { | ||||
msg->msg_namelen = min(msg->msg_namelen, SOCK_MAXADDRLEN); | |||||
sa = malloc(msg->msg_namelen, M_SONAME, M_WAITOK); | sa = malloc(msg->msg_namelen, M_SONAME, M_WAITOK); | ||||
msg->msg_name = sa; | msg->msg_name = sa; | ||||
} else | } else { | ||||
sa = NULL; | sa = NULL; | ||||
msg->msg_name = NULL; | |||||
} | |||||
uiov = msg->msg_iov; | uiov = msg->msg_iov; | ||||
msg->msg_iov = iov; | msg->msg_iov = iov; | ||||
controlp = (msg->msg_control != NULL) ? &control : NULL; | controlp = (msg->msg_control != NULL) ? &control : NULL; | ||||
error = kern_recvit(td, s, msg, UIO_SYSSPACE, controlp); | error = kern_recvit(td, s, msg, UIO_SYSSPACE, controlp); | ||||
msg->msg_iov = uiov; | msg->msg_iov = uiov; | ||||
if (error != 0) | if (error != 0) | ||||
goto bad; | goto bad; | ||||
if (msg->msg_name) { | /* | ||||
* Note that kern_recvit() updates msg->msg_namelen. | |||||
*/ | |||||
if (msg->msg_name != NULL && msg->msg_namelen > 0) { | |||||
msg->msg_name = PTRIN(linux_msghdr.msg_name); | msg->msg_name = PTRIN(linux_msghdr.msg_name); | ||||
error = bsd_to_linux_sockaddr(sa, &lsa, msg->msg_namelen); | error = bsd_to_linux_sockaddr(sa, &lsa, msg->msg_namelen); | ||||
if (error == 0) | if (error == 0) | ||||
error = copyout(lsa, PTRIN(msg->msg_name), | error = copyout(lsa, PTRIN(msg->msg_name), | ||||
msg->msg_namelen); | msg->msg_namelen); | ||||
free(lsa, M_SONAME); | free(lsa, M_SONAME); | ||||
if (error != 0) | if (error != 0) | ||||
goto bad; | goto bad; | ||||
▲ Show 20 Lines • Show All 611 Lines • Show Last 20 Lines |