diff --git a/changelog/2000.changed.md b/changelog/2000.changed.md new file mode 100644 index 0000000000..76c26768a6 --- /dev/null +++ b/changelog/2000.changed.md @@ -0,0 +1 @@ +`Mmap` now returns `Result>` replacing `Result<*mut c_void>`. \ No newline at end of file diff --git a/src/sys/mman.rs b/src/sys/mman.rs index 8cfd6d6d54..3b2b965a55 100644 --- a/src/sys/mman.rs +++ b/src/sys/mman.rs @@ -9,6 +9,7 @@ use crate::Result; use crate::{fcntl::OFlag, sys::stat::Mode}; use libc::{self, c_int, c_void, off_t, size_t}; use std::{num::NonZeroUsize, os::unix::io::{AsRawFd, AsFd}}; +use std::ptr::NonNull; libc_bitflags! { /// Desired memory protection of a memory mapping. @@ -425,7 +426,7 @@ pub unsafe fn mmap( flags: MapFlags, f: Option, offset: off_t, -) -> Result<*mut c_void> { +) -> Result> { let ptr = addr.map_or(std::ptr::null_mut(), |a| usize::from(a) as *mut c_void); @@ -435,9 +436,10 @@ pub unsafe fn mmap( if ret == libc::MAP_FAILED { Err(Errno::last()) - } else { - Ok(ret) } + else { + Ok(unsafe { NonNull::new_unchecked(ret) }) + } } /// Expands (or shrinks) an existing memory mapping, potentially moving it at @@ -527,8 +529,8 @@ pub unsafe fn madvise( /// let mut slice: &mut [u8] = unsafe { /// let mem = mmap::(None, one_k_non_zero, ProtFlags::PROT_NONE, /// MapFlags::MAP_ANON | MapFlags::MAP_PRIVATE, None, 0).unwrap(); -/// mprotect(mem, ONE_K, ProtFlags::PROT_READ | ProtFlags::PROT_WRITE).unwrap(); -/// std::slice::from_raw_parts_mut(mem as *mut u8, ONE_K) +/// mprotect(mem.as_ptr(), ONE_K, ProtFlags::PROT_READ | ProtFlags::PROT_WRITE).unwrap(); +/// std::slice::from_raw_parts_mut(mem.as_ptr().cast(), ONE_K) /// }; /// assert_eq!(slice[0], 0x00); /// slice[0] = 0xFF; diff --git a/test/sys/test_mman.rs b/test/sys/test_mman.rs index 704e14f9c5..62d9c1e227 100644 --- a/test/sys/test_mman.rs +++ b/test/sys/test_mman.rs @@ -4,7 +4,7 @@ use std::{num::NonZeroUsize, os::unix::io::BorrowedFd}; #[test] fn test_mmap_anonymous() { unsafe { - let ptr = mmap::( + let mut ptr = mmap::( None, NonZeroUsize::new(1).unwrap(), ProtFlags::PROT_READ | ProtFlags::PROT_WRITE, @@ -12,10 +12,11 @@ fn test_mmap_anonymous() { None, 0, ) - .unwrap() as *mut u8; - assert_eq!(*ptr, 0x00u8); - *ptr = 0xffu8; - assert_eq!(*ptr, 0xffu8); + .unwrap() + .cast::(); + assert_eq!(*ptr.as_ref(), 0x00u8); + *ptr.as_mut() = 0xffu8; + assert_eq!(*ptr.as_ref(), 0xffu8); } } @@ -38,7 +39,7 @@ fn test_mremap_grow() { 0, ) .unwrap(); - std::slice::from_raw_parts_mut(mem as *mut u8, ONE_K) + std::slice::from_raw_parts_mut(mem.as_ptr().cast(), ONE_K) }; assert_eq!(slice[ONE_K - 1], 0x00); slice[ONE_K - 1] = 0xFF; @@ -96,7 +97,7 @@ fn test_mremap_shrink() { 0, ) .unwrap(); - std::slice::from_raw_parts_mut(mem as *mut u8, ONE_K) + std::slice::from_raw_parts_mut(mem.as_ptr().cast(), ONE_K) }; assert_eq!(slice[ONE_K - 1], 0x00); slice[ONE_K - 1] = 0xFF;