summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJarred Allen <jarred@moveparallel.com>2023-05-19 16:58:22 -0700
committerJarred Allen <jarred@moveparallel.com>2023-05-19 17:00:13 -0700
commit96fa5a898cb3dba90469cdf5c8df9042ef391456 (patch)
treeedca68bbdbecbc89df9d3525a24698790d21ff7a
parent905c23e90be1ab4c6bc91f18f80eba17bcbd0c10 (diff)
downloadnix-96fa5a898cb3dba90469cdf5c8df9042ef391456.zip
Add test coverage for bug with unset socket address length
-rw-r--r--test/sys/test_socket.rs44
1 files changed, 44 insertions, 0 deletions
diff --git a/test/sys/test_socket.rs b/test/sys/test_socket.rs
index 0a8d0544..b78c8c49 100644
--- a/test/sys/test_socket.rs
+++ b/test/sys/test_socket.rs
@@ -203,6 +203,50 @@ pub fn test_socketpair() {
}
#[test]
+pub fn test_recvmsg_sockaddr_un() {
+ use nix::sys::socket::{
+ self, bind, socket, AddressFamily, MsgFlags, SockFlag, SockType,
+ };
+
+ let tempdir = tempfile::tempdir().unwrap();
+ let sockname = tempdir.path().join("sock");
+ let sock = socket(
+ AddressFamily::Unix,
+ SockType::Datagram,
+ SockFlag::empty(),
+ None,
+ )
+ .expect("socket failed");
+ let sockaddr = UnixAddr::new(&sockname).unwrap();
+ bind(sock, &sockaddr).expect("bind failed");
+
+ // Send a message
+ let send_buffer = "hello".as_bytes();
+ if let Err(e) = socket::sendmsg(
+ sock,
+ &[std::io::IoSlice::new(send_buffer)],
+ &[],
+ MsgFlags::empty(),
+ Some(&sockaddr),
+ ) {
+ print!("Couldn't send ({e:?}), so skipping test");
+ return;
+ }
+
+ // Receive the message
+ let mut recv_buffer = [0u8; 32];
+ let received = socket::recvmsg(
+ sock,
+ &mut [std::io::IoSliceMut::new(&mut recv_buffer)],
+ None,
+ MsgFlags::empty(),
+ )
+ .unwrap();
+ // Check the address in the received message
+ assert_eq!(sockaddr, received.address.unwrap());
+}
+
+#[test]
pub fn test_std_conversions() {
use nix::sys::socket::*;