From 9015014804a756ebcef8a5c574c74bdc978ae799 Mon Sep 17 00:00:00 2001 From: Matheus Date: Thu, 19 Sep 2024 17:24:34 -0300 Subject: [PATCH] recvmsg: fix return of ctrl length and flags --- kernel-src/sys/syscalls/recvmsg.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/kernel-src/sys/syscalls/recvmsg.c b/kernel-src/sys/syscalls/recvmsg.c index 8c722411..c0a73cb0 100644 --- a/kernel-src/sys/syscalls/recvmsg.c +++ b/kernel-src/sys/syscalls/recvmsg.c @@ -70,9 +70,6 @@ syscallret_t syscall_recvmsg(context_t *, int fd, msghdr_t *umsghdr, int flags) if (ret.errno) goto cleanup; - msghdr.ctrllen = desc.ctrldone; - msghdr.flags = (desc.flags & SOCKET_RECV_FLAGS_CTRLTRUNCATED) ? MSG_CTRUNC : 0; - uintmax_t iovoffset = 0; for (int i = 0; i < msghdr.iovcount; ++i) { ret.errno = usercopy_touser(msghdr.iov[i].addr, (void *)((uintptr_t)buffer + iovoffset), msghdr.iov[i].len); @@ -103,11 +100,20 @@ syscallret_t syscall_recvmsg(context_t *, int fd, msghdr_t *umsghdr, int flags) if (ret.errno) goto cleanup; + ret.errno = usercopy_touser(&umsghdr->ctrllen, &desc.ctrldone, sizeof(desc.ctrldone)); + if (ret.errno) + goto cleanup; + ret.errno = usercopy_touser(ptr, msghdr.msgctrl, desc.ctrldone); if (ret.errno) goto cleanup; } + if (ret.errno == 0) { + int return_flags = (desc.flags & SOCKET_RECV_FLAGS_CTRLTRUNCATED) ? MSG_CTRUNC : 0; + ret.errno = usercopy_touser(&umsghdr->flags, &return_flags, sizeof(return_flags)); + } + ret.ret = ret.errno ? -1 : desc.donecount; cleanup: