@@ -8,7 +8,7 @@ use crate::Result;
88#[ cfg( feature = "fs" ) ]
99use crate :: { fcntl:: OFlag , sys:: stat:: Mode } ;
1010use 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
1313libc_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
419419pub 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)
0 commit comments