Skip to content

Commit 67f7d46

Browse files
bors[bot]asomers
andauthored
Merge #1916
1916: Use I/O safety in sys::mman r=rtzoeller a=asomers Co-authored-by: Alan Somers <[email protected]>
2 parents 4e0c970 + 16a8c02 commit 67f7d46

File tree

2 files changed

+21
-14
lines changed

2 files changed

+21
-14
lines changed

src/sys/mman.rs

+14-7
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::{num::NonZeroUsize, os::unix::io::RawFd};
11+
use std::{num::NonZeroUsize, os::unix::io::{AsRawFd, AsFd}};
1212

1313
libc_bitflags! {
1414
/// Desired memory protection of a memory mapping.
@@ -416,17 +416,18 @@ pub fn munlockall() -> Result<()> {
416416
/// See the [`mmap(2)`] man page for detailed requirements.
417417
///
418418
/// [`mmap(2)`]: https://man7.org/linux/man-pages/man2/mmap.2.html
419-
pub unsafe fn mmap(
419+
pub unsafe fn mmap<F: AsFd>(
420420
addr: Option<NonZeroUsize>,
421421
length: NonZeroUsize,
422422
prot: ProtFlags,
423423
flags: MapFlags,
424-
fd: RawFd,
424+
f: Option<&F>,
425425
offset: off_t,
426426
) -> Result<*mut c_void> {
427427
let ptr =
428428
addr.map_or(std::ptr::null_mut(), |a| usize::from(a) as *mut c_void);
429429

430+
let fd = f.map(|f| f.as_fd().as_raw_fd()).unwrap_or(-1);
430431
let ret =
431432
libc::mmap(ptr, length.into(), prot.bits(), flags.bits(), fd, offset);
432433

@@ -518,11 +519,12 @@ pub unsafe fn madvise(
518519
/// # use nix::libc::size_t;
519520
/// # use nix::sys::mman::{mmap, mprotect, MapFlags, ProtFlags};
520521
/// # use std::ptr;
522+
/// # use std::os::unix::io::BorrowedFd;
521523
/// const ONE_K: size_t = 1024;
522524
/// let one_k_non_zero = std::num::NonZeroUsize::new(ONE_K).unwrap();
523525
/// let mut slice: &mut [u8] = unsafe {
524-
/// let mem = mmap(None, one_k_non_zero, ProtFlags::PROT_NONE,
525-
/// MapFlags::MAP_ANON | MapFlags::MAP_PRIVATE, -1, 0).unwrap();
526+
/// let mem = mmap::<BorrowedFd>(None, one_k_non_zero, ProtFlags::PROT_NONE,
527+
/// MapFlags::MAP_ANON | MapFlags::MAP_PRIVATE, None, 0).unwrap();
526528
/// mprotect(mem, ONE_K, ProtFlags::PROT_READ | ProtFlags::PROT_WRITE).unwrap();
527529
/// std::slice::from_raw_parts_mut(mem as *mut u8, ONE_K)
528530
/// };
@@ -566,9 +568,11 @@ pub fn shm_open<P>(
566568
name: &P,
567569
flag: OFlag,
568570
mode: Mode
569-
) -> Result<RawFd>
571+
) -> Result<std::os::unix::io::OwnedFd>
570572
where P: ?Sized + NixPath
571573
{
574+
use std::os::unix::io::{FromRawFd, OwnedFd};
575+
572576
let ret = name.with_nix_path(|cstr| {
573577
#[cfg(any(target_os = "macos", target_os = "ios"))]
574578
unsafe {
@@ -580,7 +584,10 @@ pub fn shm_open<P>(
580584
}
581585
})?;
582586

583-
Errno::result(ret)
587+
match ret {
588+
-1 => Err(Errno::last()),
589+
fd => Ok(unsafe{ OwnedFd::from_raw_fd(fd) })
590+
}
584591
}
585592
}
586593

test/sys/test_mman.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
use nix::sys::mman::{mmap, MapFlags, ProtFlags};
2-
use std::num::NonZeroUsize;
2+
use std::{num::NonZeroUsize, os::unix::io::BorrowedFd};
33

44
#[test]
55
fn test_mmap_anonymous() {
66
unsafe {
7-
let ptr = mmap(
7+
let ptr = mmap::<BorrowedFd>(
88
None,
99
NonZeroUsize::new(1).unwrap(),
1010
ProtFlags::PROT_READ | ProtFlags::PROT_WRITE,
1111
MapFlags::MAP_PRIVATE | MapFlags::MAP_ANONYMOUS,
12-
-1,
12+
None,
1313
0,
1414
)
1515
.unwrap() as *mut u8;
@@ -29,12 +29,12 @@ fn test_mremap_grow() {
2929
let one_k_non_zero = NonZeroUsize::new(ONE_K).unwrap();
3030

3131
let slice: &mut [u8] = unsafe {
32-
let mem = mmap(
32+
let mem = mmap::<BorrowedFd>(
3333
None,
3434
one_k_non_zero,
3535
ProtFlags::PROT_READ | ProtFlags::PROT_WRITE,
3636
MapFlags::MAP_ANONYMOUS | MapFlags::MAP_PRIVATE,
37-
-1,
37+
None,
3838
0,
3939
)
4040
.unwrap();
@@ -87,12 +87,12 @@ fn test_mremap_shrink() {
8787
const ONE_K: size_t = 1024;
8888
let ten_one_k = NonZeroUsize::new(10 * ONE_K).unwrap();
8989
let slice: &mut [u8] = unsafe {
90-
let mem = mmap(
90+
let mem = mmap::<BorrowedFd>(
9191
None,
9292
ten_one_k,
9393
ProtFlags::PROT_READ | ProtFlags::PROT_WRITE,
9494
MapFlags::MAP_ANONYMOUS | MapFlags::MAP_PRIVATE,
95-
-1,
95+
None,
9696
0,
9797
)
9898
.unwrap();

0 commit comments

Comments
 (0)