Skip to content

Commit 6e2b0a0

Browse files
Merge #1870
1870: mmap addr r=asomers a=JonathanWoollett-Light Uses `Some<size_t>` instead of `*mut c_void` for the `addr` passed to [`sys::mman::mmap`](https://docs.rs/nix/latest/nix/sys/mman/fn.mmap.html). In this instance we are not usefully passing a pointer, it will never be dereferenced. We are passing a location which represents where to attach the shared memory to. In this case `size_t` better represents an address and not a pointer, and `Option<size_t>` better represents an optional argument than `NULLPTR`. In C since there is no optional type this is a pointer as this allows it be null which is an alias here for `None`. Co-authored-by: Jonathan <[email protected]>
2 parents 2ad2f48 + d34696c commit 6e2b0a0

File tree

3 files changed

+14
-7
lines changed

3 files changed

+14
-7
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ This project adheres to [Semantic Versioning](https://semver.org/).
3535

3636
- The MSRV is now 1.56.1
3737
([#1792](https://github.com/nix-rust/nix/pull/1792))
38+
- The `addr` argument of `sys::mman::mmap` is now of type `Option<NonZeroUsize>`.
39+
([#1870](https://github.com/nix-rust/nix/pull/1870))
3840

3941
### Fixed
4042

src/sys/mman.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::Result;
88
#[cfg(feature = "fs")]
99
use crate::{fcntl::OFlag, sys::stat::Mode};
1010
use libc::{self, c_int, c_void, off_t, size_t};
11-
use std::os::unix::io::RawFd;
11+
use std::{os::unix::io::RawFd, num::NonZeroUsize};
1212

1313
libc_bitflags! {
1414
/// Desired memory protection of a memory mapping.
@@ -417,14 +417,19 @@ pub fn munlockall() -> Result<()> {
417417
///
418418
/// [`mmap(2)`]: https://man7.org/linux/man-pages/man2/mmap.2.html
419419
pub unsafe fn mmap(
420-
addr: *mut c_void,
420+
addr: Option<NonZeroUsize>,
421421
length: size_t,
422422
prot: ProtFlags,
423423
flags: MapFlags,
424424
fd: RawFd,
425425
offset: off_t,
426426
) -> Result<*mut c_void> {
427-
let ret = libc::mmap(addr, length, prot.bits(), flags.bits(), fd, offset);
427+
let ptr = addr.map_or(
428+
std::ptr::null_mut(),
429+
|a| usize::from(a) as *mut c_void
430+
);
431+
432+
let ret = libc::mmap(ptr, length, prot.bits(), flags.bits(), fd, offset);
428433

429434
if ret == libc::MAP_FAILED {
430435
Err(Errno::last())
@@ -516,7 +521,7 @@ pub unsafe fn madvise(
516521
/// # use std::ptr;
517522
/// const ONE_K: size_t = 1024;
518523
/// let mut slice: &mut [u8] = unsafe {
519-
/// let mem = mmap(ptr::null_mut(), ONE_K, ProtFlags::PROT_NONE,
524+
/// let mem = mmap(None, ONE_K, ProtFlags::PROT_NONE,
520525
/// MapFlags::MAP_ANON | MapFlags::MAP_PRIVATE, -1, 0).unwrap();
521526
/// mprotect(mem, ONE_K, ProtFlags::PROT_READ | ProtFlags::PROT_WRITE).unwrap();
522527
/// std::slice::from_raw_parts_mut(mem as *mut u8, ONE_K)

test/sys/test_mman.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use nix::sys::mman::{mmap, MapFlags, ProtFlags};
44
fn test_mmap_anonymous() {
55
unsafe {
66
let ptr = mmap(
7-
std::ptr::null_mut(),
7+
None,
88
1,
99
ProtFlags::PROT_READ | ProtFlags::PROT_WRITE,
1010
MapFlags::MAP_PRIVATE | MapFlags::MAP_ANONYMOUS,
@@ -27,7 +27,7 @@ fn test_mremap_grow() {
2727
const ONE_K: size_t = 1024;
2828
let slice: &mut [u8] = unsafe {
2929
let mem = mmap(
30-
std::ptr::null_mut(),
30+
None,
3131
ONE_K,
3232
ProtFlags::PROT_READ | ProtFlags::PROT_WRITE,
3333
MapFlags::MAP_ANONYMOUS | MapFlags::MAP_PRIVATE,
@@ -83,7 +83,7 @@ fn test_mremap_shrink() {
8383
const ONE_K: size_t = 1024;
8484
let slice: &mut [u8] = unsafe {
8585
let mem = mmap(
86-
std::ptr::null_mut(),
86+
None,
8787
10 * ONE_K,
8888
ProtFlags::PROT_READ | ProtFlags::PROT_WRITE,
8989
MapFlags::MAP_ANONYMOUS | MapFlags::MAP_PRIVATE,

0 commit comments

Comments
 (0)