//! `listen`: the directory at 0700, the socket at 0600, a stale socket replaced, and no mode //! changed through a symbolic link (M5a spec, section 7). Do not edit. #[path = "support/tmp.rs"] mod tmp; use std::os::unix::fs::PermissionsExt; use std::os::unix::net::UnixStream; use memoryd::socket::listen; use tmp::TempDir; fn mode(path: &std::path::Path) -> u32 { std::fs::metadata(path).unwrap().permissions().mode() & 0o777 } #[test] fn directory_and_socket_are_private_and_a_stale_socket_is_replaced() { let dir = TempDir::new("socket"); let run = dir.path().join("run/loop-memory"); std::fs::create_dir_all(&run).unwrap(); std::fs::set_permissions(&run, std::fs::Permissions::from_mode(0o755)).unwrap(); let socket = run.join("memory.sock"); let first = listen(&socket).unwrap(); assert_eq!((mode(&run), mode(&socket)), (0o700, 0o600)); drop(first); let second = listen(&socket).expect("a stale socket is removed"); assert!(UnixStream::connect(&socket).is_ok()); drop(second); } #[test] fn no_directory_and_symbolic_links_are_refused() { let dir = TempDir::new("socket-link"); let target = dir.path().join("shared"); std::fs::create_dir_all(&target).unwrap(); std::fs::set_permissions(&target, std::fs::Permissions::from_mode(0o755)).unwrap(); std::os::unix::fs::symlink(&target, dir.path().join("link")).unwrap(); let err = listen(&dir.path().join("link/memory.sock")).unwrap_err(); assert!(err.contains("symbolic link"), "{err}"); assert_eq!(mode(&target), 0o755, "the target's mode is untouched"); let err = listen(std::path::Path::new("/memory.sock")).unwrap_err(); assert!(err.contains("directory of its own"), "{err}"); }