Changeset View
Changeset View
Standalone View
Standalone View
sys/compat/linux/linux_socket.c
Show First 20 Lines • Show All 1,332 Lines • ▼ Show 20 Lines | if (control) { | ||||
cm = CMSG_FIRSTHDR(msg); | cm = CMSG_FIRSTHDR(msg); | ||||
while (cm != NULL) { | while (cm != NULL) { | ||||
linux_cmsg->cmsg_type = | linux_cmsg->cmsg_type = | ||||
bsd_to_linux_cmsg_type(cm->cmsg_type); | bsd_to_linux_cmsg_type(cm->cmsg_type); | ||||
linux_cmsg->cmsg_level = | linux_cmsg->cmsg_level = | ||||
bsd_to_linux_sockopt_level(cm->cmsg_level); | bsd_to_linux_sockopt_level(cm->cmsg_level); | ||||
if (linux_cmsg->cmsg_type == -1 | if (linux_cmsg->cmsg_type == -1 || | ||||
|| cm->cmsg_level != SOL_SOCKET) | cm->cmsg_level != SOL_SOCKET) { | ||||
{ | |||||
error = EINVAL; | error = EINVAL; | ||||
goto bad; | goto bad; | ||||
} | } | ||||
data = CMSG_DATA(cm); | data = CMSG_DATA(cm); | ||||
datalen = (caddr_t)cm + cm->cmsg_len - (caddr_t)data; | datalen = (caddr_t)cm + cm->cmsg_len - (caddr_t)data; | ||||
switch (cm->cmsg_type) | switch (cm->cmsg_type) { | ||||
{ | |||||
case SCM_RIGHTS: | case SCM_RIGHTS: | ||||
if (flags & LINUX_MSG_CMSG_CLOEXEC) { | if (flags & LINUX_MSG_CMSG_CLOEXEC) { | ||||
fds = datalen / sizeof(int); | fds = datalen / sizeof(int); | ||||
fdp = data; | fdp = data; | ||||
for (i = 0; i < fds; i++) { | for (i = 0; i < fds; i++) { | ||||
fd = *fdp++; | fd = *fdp++; | ||||
(void)kern_fcntl(td, fd, | (void)kern_fcntl(td, fd, | ||||
F_SETFD, FD_CLOEXEC); | F_SETFD, FD_CLOEXEC); | ||||
Show All 36 Lines | while (cm != NULL) { | ||||
if (outlen + LINUX_CMSG_LEN(datalen) > | if (outlen + LINUX_CMSG_LEN(datalen) > | ||||
linux_msg.msg_controllen) { | linux_msg.msg_controllen) { | ||||
if (outlen == 0) { | if (outlen == 0) { | ||||
error = EMSGSIZE; | error = EMSGSIZE; | ||||
goto bad; | goto bad; | ||||
} else { | } else { | ||||
linux_msg.msg_flags |= | linux_msg.msg_flags |= | ||||
LINUX_MSG_CTRUNC; | LINUX_MSG_CTRUNC; | ||||
m_dispose_extcontrolm(control); | |||||
goto out; | goto out; | ||||
} | } | ||||
} | } | ||||
linux_cmsg->cmsg_len = LINUX_CMSG_LEN(datalen); | linux_cmsg->cmsg_len = LINUX_CMSG_LEN(datalen); | ||||
error = copyout(linux_cmsg, outbuf, L_CMSG_HDRSZ); | error = copyout(linux_cmsg, outbuf, L_CMSG_HDRSZ); | ||||
if (error != 0) | if (error != 0) | ||||
Show All 11 Lines | if (control) { | ||||
} | } | ||||
} | } | ||||
out: | out: | ||||
linux_msg.msg_controllen = outlen; | linux_msg.msg_controllen = outlen; | ||||
error = copyout(&linux_msg, msghdr, sizeof(linux_msg)); | error = copyout(&linux_msg, msghdr, sizeof(linux_msg)); | ||||
bad: | bad: | ||||
free(iov, M_IOV); | if (control != NULL) { | ||||
if (error != 0) | |||||
m_dispose_extcontrolm(control); | |||||
m_freem(control); | m_freem(control); | ||||
} | |||||
free(iov, M_IOV); | |||||
free(linux_cmsg, M_LINUX); | free(linux_cmsg, M_LINUX); | ||||
return (error); | return (error); | ||||
} | } | ||||
int | int | ||||
linux_recvmsg(struct thread *td, struct linux_recvmsg_args *args) | linux_recvmsg(struct thread *td, struct linux_recvmsg_args *args) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 323 Lines • Show Last 20 Lines |