diff --git a/src/clientmem.rs b/src/clientmem.rs index 8463eb1d..a88cd2f1 100644 --- a/src/clientmem.rs +++ b/src/clientmem.rs @@ -53,6 +53,28 @@ impl ClientMem { read_only: bool, client: Option<&Client>, cpu: Option<&Rc>, + ) -> Result { + Self::new2(fd, len, read_only, client, cpu, c::MAP_SHARED) + } + + #[cfg_attr(not(feature = "it"), expect(dead_code))] + pub fn new_private( + fd: &Rc, + len: usize, + read_only: bool, + client: Option<&Client>, + cpu: Option<&Rc>, + ) -> Result { + Self::new2(fd, len, read_only, client, cpu, c::MAP_PRIVATE) + } + + fn new2( + fd: &Rc, + len: usize, + read_only: bool, + client: Option<&Client>, + cpu: Option<&Rc>, + flags: c::c_int, ) -> Result { let mut sigbus_impossible = false; if let Ok(seals) = uapi::fcntl_get_seals(fd.raw()) { @@ -79,7 +101,7 @@ impl ClientMem { false => c::PROT_READ | c::PROT_WRITE, }; unsafe { - let data = c::mmap64(ptr::null_mut(), len, prot, c::MAP_SHARED, fd.raw(), 0); + let data = c::mmap64(ptr::null_mut(), len, prot, flags, fd.raw(), 0); if data == c::MAP_FAILED { return Err(ClientMemError::MmapFailed(uapi::Errno::default().into())); } diff --git a/src/it/test_ifs/test_virtual_keyboard.rs b/src/it/test_ifs/test_virtual_keyboard.rs index 9b45a267..38498bc0 100644 --- a/src/it/test_ifs/test_virtual_keyboard.rs +++ b/src/it/test_ifs/test_virtual_keyboard.rs @@ -31,7 +31,7 @@ impl TestVirtualKeyboard { uapi::lseek(memfd.raw(), 0, c::SEEK_SET).unwrap(); uapi::fcntl_add_seals( memfd.raw(), - c::F_SEAL_SEAL | c::F_SEAL_GROW | c::F_SEAL_SHRINK | c::F_SEAL_WRITE, + c::F_SEAL_SEAL | c::F_SEAL_GROW | c::F_SEAL_SHRINK, ) .unwrap(); self.tran.send(Keymap { diff --git a/src/it/tests/t0040_virtual_keyboard.rs b/src/it/tests/t0040_virtual_keyboard.rs index dc2b1d1f..e667144c 100644 --- a/src/it/tests/t0040_virtual_keyboard.rs +++ b/src/it/tests/t0040_virtual_keyboard.rs @@ -149,7 +149,7 @@ async fn test(run: Rc) -> TestResult { } fn read_keymap(fd: &Rc, size: usize) -> String { - let client_mem = ClientMem::new(fd, size - 1, true, None, None).unwrap(); + let client_mem = ClientMem::new_private(fd, size - 1, true, None, None).unwrap(); let client_mem = Rc::new(client_mem).offset(0); let mut v = vec![]; client_mem.read(&mut v).unwrap();