From 4d6c9db9c0746bcef1b30d6f0f6b6e5cb635a4f3 Mon Sep 17 00:00:00 2001 From: Benton60 Date: Fri, 27 Mar 2026 09:43:50 -0400 Subject: [PATCH] fix a todo --- netstack/src/scheme/tcp.rs | 8 +++----- netstack/src/scheme/udp.rs | 7 +++---- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/netstack/src/scheme/tcp.rs b/netstack/src/scheme/tcp.rs index 583011197e..73f89d53a8 100644 --- a/netstack/src/scheme/tcp.rs +++ b/netstack/src/scheme/tcp.rs @@ -327,10 +327,10 @@ impl<'a> SchemeSocket for TcpSocket<'a> { let prepared_msg_controllen = usize::from_le_bytes( how[2 * usize_length..3 * usize_length].try_into().map_err(|_| SyscallError::new(syscall::EINVAL))?, ); - if prepared_name_len + prepared_msg_controllen + prepared_whole_iov_size > how.len() {//expected returned buffer size is larger than provided -> return invalid + if 3 * usize_length + prepared_name_len + prepared_msg_controllen + prepared_whole_iov_size > how.len() {//expected returned buffer size is larger than provided -> return invalid return Err(SyscallError::new(syscall::EINVAL)); } - let mut address = match self.remote_endpoint() { + let address = match self.remote_endpoint() { Some(endpoint) => format!("/scheme/tcp/{}:{}", endpoint.addr, endpoint.port), None => String::from("/scheme/tcp/0.0.0.0:0"), }; @@ -339,11 +339,9 @@ impl<'a> SchemeSocket for TcpSocket<'a> { how[..usize_length].copy_from_slice(&address.len().to_le_bytes()); how[usize_length..address.len() + usize_length].copy_from_slice(&address.as_bytes()); let payload_length = self.recv_slice(&mut how[address.len() + 2 * usize_length..address.len() + 2 * usize_length + prepared_whole_iov_size]).unwrap(); - println!("\n\n{}\n", payload_length); how[address.len() + usize_length..address.len() + 2 * usize_length].copy_from_slice(&payload_length.to_le_bytes()); - //TODO should return the length of payload but relibc uses trim on the buffer incorrectly - Ok(how.len()) + Ok(address.len() + 2 * usize_length + prepared_whole_iov_size) } else if socket_file.flags & syscall::O_NONBLOCK == syscall::O_NONBLOCK || flags & flag::MSG_DONTWAIT as usize != 0 { Err(SyscallError::new(syscall::EAGAIN)) } else { diff --git a/netstack/src/scheme/udp.rs b/netstack/src/scheme/udp.rs index 8cb1292c1b..d30d45059c 100644 --- a/netstack/src/scheme/udp.rs +++ b/netstack/src/scheme/udp.rs @@ -317,13 +317,13 @@ impl<'a> SchemeSocket for UdpSocket<'a> { let prepared_msg_controllen = usize::from_le_bytes( how[2 * usize_length..3 * usize_length].try_into().map_err(|_| SyscallError::new(syscall::EINVAL))?, ); - if prepared_name_len + prepared_msg_controllen + prepared_whole_iov_size > how.len() {//expected returned buffer size is larger than provided -> return invalid + if 3 * usize_length + prepared_name_len + prepared_msg_controllen + prepared_whole_iov_size > how.len() {//expected returned buffer size is larger than provided -> return invalid return Err(SyscallError::new(syscall::EINVAL)); } //the relibc deserialization functions expect NO GAPS between the name and payload slices //so the payload must be temporarily stored during recv_slice - let mut payload_tmp = vec![0u8; prepared_whole_iov_size - prepared_name_len]; + let mut payload_tmp = vec![0u8; prepared_whole_iov_size]; let (length, address) = self.recv_slice(&mut payload_tmp).expect("Can't recieve slice"); //Address Handling @@ -339,8 +339,7 @@ impl<'a> SchemeSocket for UdpSocket<'a> { //Payload Handling how[payload_len_index..payload_len_index + usize_length].copy_from_slice(&(length as usize).to_le_bytes()); how[payload_len_index + usize_length..payload_len_index + usize_length + length].copy_from_slice(&payload_tmp[..length]); - //TODO should return the length of payload but relibc uses trim on the buffer incorrectly - Ok(how.len()) + Ok(payload_len_index + usize_length + length) } else if socket_file.flags & syscall::O_NONBLOCK == syscall::O_NONBLOCK || flags & flag::MSG_DONTWAIT as usize != 0 { Err(SyscallError::new(syscall::EAGAIN)) } else {