Skip to content

Commit 8d27985

Browse files
Merge #1873
1873: mmap non-zero length r=asomers a=JonathanWoollett-Light When calling [`mmap`](https://man7.org/linux/man-pages/man2/mmap.2.html) the passed length needs to be greater than zero, else an error is returned: > EINVAL (since Linux 2.6.12) length was 0. By specifying the argument as `std::num::NonZeroUsize` we eliminate this error case. Co-authored-by: Jonathan <[email protected]>
2 parents 33b5f92 + 63c5626 commit 8d27985

File tree

3 files changed

+16
-8
lines changed

3 files changed

+16
-8
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ This project adheres to [Semantic Versioning](https://semver.org/).
3939
([#1792](https://github.com/nix-rust/nix/pull/1792))
4040
- The `addr` argument of `sys::mman::mmap` is now of type `Option<NonZeroUsize>`.
4141
([#1870](https://github.com/nix-rust/nix/pull/1870))
42+
- The `length` argument of `sys::mman::mmap` is now of type `NonZeroUsize`.
43+
([#1873](https://github.com/nix-rust/nix/pull/1873))
4244

4345
### Fixed
4446

src/sys/mman.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ pub fn munlockall() -> Result<()> {
418418
/// [`mmap(2)`]: https://man7.org/linux/man-pages/man2/mmap.2.html
419419
pub unsafe fn mmap(
420420
addr: Option<NonZeroUsize>,
421-
length: size_t,
421+
length: NonZeroUsize,
422422
prot: ProtFlags,
423423
flags: MapFlags,
424424
fd: RawFd,
@@ -428,8 +428,8 @@ pub unsafe fn mmap(
428428
std::ptr::null_mut(),
429429
|a| usize::from(a) as *mut c_void
430430
);
431-
432-
let ret = libc::mmap(ptr, length, prot.bits(), flags.bits(), fd, offset);
431+
432+
let ret = libc::mmap(ptr, length.into(), prot.bits(), flags.bits(), fd, offset);
433433

434434
if ret == libc::MAP_FAILED {
435435
Err(Errno::last())
@@ -520,8 +520,9 @@ pub unsafe fn madvise(
520520
/// # use nix::sys::mman::{mmap, mprotect, MapFlags, ProtFlags};
521521
/// # use std::ptr;
522522
/// const ONE_K: size_t = 1024;
523+
/// let one_k_non_zero = std::num::NonZeroUsize::new(ONE_K).unwrap();
523524
/// let mut slice: &mut [u8] = unsafe {
524-
/// let mem = mmap(None, ONE_K, ProtFlags::PROT_NONE,
525+
/// let mem = mmap(None, one_k_non_zero, ProtFlags::PROT_NONE,
525526
/// MapFlags::MAP_ANON | MapFlags::MAP_PRIVATE, -1, 0).unwrap();
526527
/// mprotect(mem, ONE_K, ProtFlags::PROT_READ | ProtFlags::PROT_WRITE).unwrap();
527528
/// std::slice::from_raw_parts_mut(mem as *mut u8, ONE_K)

test/sys/test_mman.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
use nix::sys::mman::{mmap, MapFlags, ProtFlags};
2+
use std::num::NonZeroUsize;
23

34
#[test]
45
fn test_mmap_anonymous() {
56
unsafe {
67
let ptr = mmap(
78
None,
8-
1,
9+
NonZeroUsize::new(1).unwrap(),
910
ProtFlags::PROT_READ | ProtFlags::PROT_WRITE,
1011
MapFlags::MAP_PRIVATE | MapFlags::MAP_ANONYMOUS,
1112
-1,
@@ -25,10 +26,12 @@ fn test_mremap_grow() {
2526
use nix::sys::mman::{mremap, MRemapFlags};
2627

2728
const ONE_K: size_t = 1024;
29+
let one_k_non_zero = NonZeroUsize::new(ONE_K).unwrap();
30+
2831
let slice: &mut [u8] = unsafe {
2932
let mem = mmap(
3033
None,
31-
ONE_K,
34+
one_k_non_zero,
3235
ProtFlags::PROT_READ | ProtFlags::PROT_WRITE,
3336
MapFlags::MAP_ANONYMOUS | MapFlags::MAP_PRIVATE,
3437
-1,
@@ -79,12 +82,14 @@ fn test_mremap_grow() {
7982
fn test_mremap_shrink() {
8083
use nix::libc::{c_void, size_t};
8184
use nix::sys::mman::{mremap, MRemapFlags};
85+
use std::num::NonZeroUsize;
8286

8387
const ONE_K: size_t = 1024;
88+
let ten_one_k = NonZeroUsize::new(10 * ONE_K).unwrap();
8489
let slice: &mut [u8] = unsafe {
8590
let mem = mmap(
8691
None,
87-
10 * ONE_K,
92+
ten_one_k,
8893
ProtFlags::PROT_READ | ProtFlags::PROT_WRITE,
8994
MapFlags::MAP_ANONYMOUS | MapFlags::MAP_PRIVATE,
9095
-1,
@@ -100,7 +105,7 @@ fn test_mremap_shrink() {
100105
let slice: &mut [u8] = unsafe {
101106
let mem = mremap(
102107
slice.as_mut_ptr() as *mut c_void,
103-
10 * ONE_K,
108+
ten_one_k.into(),
104109
ONE_K,
105110
MRemapFlags::empty(),
106111
None,

0 commit comments

Comments
 (0)