diff options
author | Dmitry Chagin <dchagin@FreeBSD.org> | 2023-08-14 12:46:12 +0000 |
---|---|---|
committer | Dmitry Chagin <dchagin@FreeBSD.org> | 2023-08-14 12:46:12 +0000 |
commit | 2467ccddc0e0f5c719eddaece69a7aa0589b6449 (patch) | |
tree | 289588b07b96043ad9d4ad00aa6e7ba321aa1fa8 | |
parent | 9d0c9b6d6a6a90f626088308dfb895221bf6d36f (diff) | |
download | src-2467ccddc0e0f5c719eddaece69a7aa0589b6449.tar.gz src-2467ccddc0e0f5c719eddaece69a7aa0589b6449.zip |
linux(4): Fix MSG_CTRUNC handling in recvmsg()
The MSG_CTRUNC flag of the msg_flags member of the message header is
set uppon successful completition if the control data was truncated.
Upon return from a successful call msg_controllen should contain the
length of the control message sequence.
Fixes: 0eda2cea
MFC after: 1 week
-rw-r--r-- | sys/compat/linux/linux_socket.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/sys/compat/linux/linux_socket.c b/sys/compat/linux/linux_socket.c index bd4b536e13d0..7acae92777f8 100644 --- a/sys/compat/linux/linux_socket.c +++ b/sys/compat/linux/linux_socket.c @@ -1835,8 +1835,8 @@ linux_recvmsg_common(struct thread *td, l_int s, struct l_msghdr *msghdr, if (error != 0) goto bad; + skiped = outlen = 0; maxlen = l_msghdr.msg_controllen; - l_msghdr.msg_controllen = 0; if (control == NULL) goto out; @@ -1844,7 +1844,6 @@ linux_recvmsg_common(struct thread *td, l_int s, struct l_msghdr *msghdr, msg->msg_control = mtod(control, struct cmsghdr *); msg->msg_controllen = control->m_len; outbuf = PTRIN(l_msghdr.msg_control); - skiped = outlen = 0; for (m = control; m != NULL; m = m->m_next) { cm = mtod(m, struct cmsghdr *); lcm->cmsg_type = bsd_to_linux_cmsg_type(p, cm->cmsg_type, @@ -1910,9 +1909,9 @@ err: error = EINVAL; goto bad; } - l_msghdr.msg_controllen = outlen; out: + l_msghdr.msg_controllen = outlen; error = copyout(&l_msghdr, msghdr, sizeof(l_msghdr)); bad: |