From 5e61f17a3ab59f0fba9725e009219a6b8d165138 Mon Sep 17 00:00:00 2001 From: "Ibuki.O" Date: Sun, 8 Feb 2026 12:09:08 +0900 Subject: [PATCH] feat: Implement MSG_CMSG_CLOEXEC handling to recvmsg --- src/header/sys_socket/constants.rs | 1 + src/platform/redox/socket.rs | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/header/sys_socket/constants.rs b/src/header/sys_socket/constants.rs index 7d6c8b972f..ec42889bf5 100644 --- a/src/header/sys_socket/constants.rs +++ b/src/header/sys_socket/constants.rs @@ -50,6 +50,7 @@ pub const MSG_PEEK: c_int = 2; pub const MSG_TRUNC: c_int = 32; pub const MSG_DONTWAIT: c_int = 64; pub const MSG_WAITALL: c_int = 256; +pub const MSG_CMSG_CLOEXEC: c_int = 0x40000000; pub const IP_ADD_SOURCE_MEMBERSHIP: c_int = 70; pub const IP_DROP_SOURCE_MEMBERSHIP: c_int = 71; diff --git a/src/platform/redox/socket.rs b/src/platform/redox/socket.rs index 26cd6930d3..82cd715dad 100644 --- a/src/platform/redox/socket.rs +++ b/src/platform/redox/socket.rs @@ -394,6 +394,7 @@ unsafe fn deserialize_ancillary_data_from_stream( msg_stream: &[u8], cursor: &mut usize, cmsg_space_provided: usize, + flags: c_int, ) -> Result<()> { let mut current_cmsg_ptr_in_user_buf = if !mhdr.msg_control.is_null() && cmsg_space_provided > 0 { @@ -449,7 +450,12 @@ unsafe fn deserialize_ancillary_data_from_stream( ) }; - redox_rt::sys::sys_call_ro(socket as usize, fds_bytes, CallFlags::FD, &[])?; + let mut call_flags = CallFlags::FD; + if flags & MSG_CMSG_CLOEXEC == MSG_CMSG_CLOEXEC { + call_flags |= CallFlags::FD_CLOEXEC; + } + + redox_rt::sys::sys_call_ro(socket as usize, fds_bytes, call_flags, &[])?; for fd in fds_usize { temp_posix_cmsg_data_buf.extend_from_slice(&(fd as c_int).to_le_bytes()); @@ -908,6 +914,7 @@ impl PalSocket for Sys { &msg_stream, &mut cursor, cmsg_space_provided_by_user as usize, + flags, ) })?; } else {