Skip to content

Commit 01585f5

Browse files
authored
Split test_unix_peercred into implicit and explicit versions. (#916)
The `test_unix_peercred` test tests passing credentials over a socket. It uses `set_sockopt_passcred` to enable this, but when enabled, credentials are received on all messages, not just those with explicit credentials passed. So make two copies of this test, one where credentials are passed explicitly, and one that relies on implicit passing.
1 parent 7266eb4 commit 01585f5

File tree

1 file changed

+56
-5
lines changed

1 file changed

+56
-5
lines changed

tests/net/unix.rs

Lines changed: 56 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -582,12 +582,66 @@ fn test_unix_msg_with_scm_rights() {
582582

583583
#[cfg(all(feature = "process", linux_kernel))]
584584
#[test]
585-
fn test_unix_peercred() {
585+
fn test_unix_peercred_explicit() {
586586
use rustix::io::{IoSlice, IoSliceMut};
587587
use rustix::net::{
588588
recvmsg, sendmsg, sockopt, RecvAncillaryBuffer, RecvAncillaryMessage, RecvFlags,
589589
SendAncillaryBuffer, SendAncillaryMessage, SendFlags, SocketFlags,
590590
};
591+
592+
let (send_sock, recv_sock) = rustix::net::socketpair(
593+
AddressFamily::UNIX,
594+
SocketType::STREAM,
595+
SocketFlags::CLOEXEC,
596+
None,
597+
)
598+
.unwrap();
599+
600+
sockopt::set_socket_passcred(&recv_sock, true).unwrap();
601+
602+
let ucred = sockopt::get_socket_peercred(&send_sock).unwrap();
603+
let msg = SendAncillaryMessage::ScmCredentials(ucred);
604+
let mut space = [0; rustix::cmsg_space!(ScmCredentials(1))];
605+
let mut cmsg_buffer = SendAncillaryBuffer::new(&mut space);
606+
assert!(cmsg_buffer.push(msg));
607+
608+
sendmsg(
609+
&send_sock,
610+
&[IoSlice::new(b"cred")],
611+
&mut cmsg_buffer,
612+
SendFlags::empty(),
613+
)
614+
.unwrap();
615+
616+
let mut cmsg_space = [0; rustix::cmsg_space!(ScmCredentials(1))];
617+
let mut cmsg_buffer = RecvAncillaryBuffer::new(&mut cmsg_space);
618+
619+
let mut buffer = [0; BUFFER_SIZE];
620+
recvmsg(
621+
&recv_sock,
622+
&mut [IoSliceMut::new(&mut buffer)],
623+
&mut cmsg_buffer,
624+
RecvFlags::empty(),
625+
)
626+
.unwrap();
627+
628+
match cmsg_buffer.drain().next().unwrap() {
629+
RecvAncillaryMessage::ScmCredentials(ucred2) => assert_eq!(ucred2, ucred),
630+
_ => panic!("Unexpected ancilliary message"),
631+
};
632+
}
633+
634+
/// Like `test_unix_peercred_explicit`, but relies on the fact that
635+
/// `set_socket_passcred` enables passing of the credentials implicitly
636+
/// instead of passing an explicit message to `sendmsg`.
637+
#[cfg(all(feature = "process", linux_kernel))]
638+
#[test]
639+
fn test_unix_peercred_implicit() {
640+
use rustix::io::{IoSlice, IoSliceMut};
641+
use rustix::net::{
642+
recvmsg, sendmsg, sockopt, RecvAncillaryBuffer, RecvAncillaryMessage, RecvFlags,
643+
SendAncillaryBuffer, SendFlags, SocketFlags,
644+
};
591645
use rustix::process::{getgid, getpid, getuid};
592646

593647
let (send_sock, recv_sock) = rustix::net::socketpair(
@@ -605,10 +659,7 @@ fn test_unix_peercred() {
605659
assert_eq!(ucred.uid, getuid());
606660
assert_eq!(ucred.gid, getgid());
607661

608-
let msg = SendAncillaryMessage::ScmCredentials(ucred);
609-
let mut space = [0; rustix::cmsg_space!(ScmCredentials(1))];
610-
let mut cmsg_buffer = SendAncillaryBuffer::new(&mut space);
611-
assert!(cmsg_buffer.push(msg));
662+
let mut cmsg_buffer = SendAncillaryBuffer::default();
612663

613664
sendmsg(
614665
&send_sock,

0 commit comments

Comments
 (0)