diff --git a/CHANGELOG.md b/CHANGELOG.md index e8bde843f1..ee6e9fa326 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,8 @@ This project adheres to [Semantic Versioning](https://semver.org/). `sys::kevent::Kqueue::kevent`, and `sys::event::kqueue` is deprecated in favor of `sys::kevent::Kqueue::new`. ([#1943](https://github.com/nix-rust/nix/pull/1943)) +- `sys::mman::mmap` to return `NonNull`. + ([#2000](https://github.com/nix-rust/nix/pull/2000)) ### Fixed - Fix `SockaddrIn6` bug that was swapping flowinfo and scope_id byte ordering. diff --git a/src/sys/mman.rs b/src/sys/mman.rs index e689e06e04..0a056a5270 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. @@ -423,19 +424,15 @@ 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); let fd = f.map(|f| f.as_fd().as_raw_fd()).unwrap_or(-1); let ret = libc::mmap(ptr, length.into(), prot.bits(), flags.bits(), fd, offset); - - if ret == libc::MAP_FAILED { - Err(Errno::last()) - } else { - Ok(ret) - } + + NonNull::new(ret).ok_or_else(||Errno::last()) } /// Expands (or shrinks) an existing memory mapping, potentially moving it at @@ -525,8 +522,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 b4674e53fa..832e2aba00 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;