@@ -8,10 +8,8 @@ use crate::Result;
8
8
#[ cfg( feature = "fs" ) ]
9
9
use crate :: { fcntl:: OFlag , sys:: stat:: Mode } ;
10
10
use libc:: { self , c_int, c_void, off_t, size_t} ;
11
- use std:: {
12
- num:: NonZeroUsize ,
13
- os:: unix:: io:: { AsFd , AsRawFd } ,
14
- } ;
11
+ use std:: { num:: NonZeroUsize , os:: unix:: io:: { AsRawFd , AsFd } } ;
12
+ use std:: ptr:: NonNull ;
15
13
16
14
libc_bitflags ! {
17
15
/// Desired memory protection of a memory mapping.
@@ -377,8 +375,8 @@ libc_bitflags! {
377
375
/// `addr` must meet all the requirements described in the [`mlock(2)`] man page.
378
376
///
379
377
/// [`mlock(2)`]: https://man7.org/linux/man-pages/man2/mlock.2.html
380
- pub unsafe fn mlock ( addr : * const c_void , length : size_t ) -> Result < ( ) > {
381
- Errno :: result ( libc:: mlock ( addr, length) ) . map ( drop)
378
+ pub unsafe fn mlock ( addr : NonNull < c_void > , length : size_t ) -> Result < ( ) > {
379
+ Errno :: result ( libc:: mlock ( addr. as_ptr ( ) , length) ) . map ( drop)
382
380
}
383
381
384
382
/// Unlocks all memory pages that contain part of the address range with
@@ -390,8 +388,8 @@ pub unsafe fn mlock(addr: *const c_void, length: size_t) -> Result<()> {
390
388
/// page.
391
389
///
392
390
/// [`munlock(2)`]: https://man7.org/linux/man-pages/man2/munlock.2.html
393
- pub unsafe fn munlock ( addr : * const c_void , length : size_t ) -> Result < ( ) > {
394
- Errno :: result ( libc:: munlock ( addr, length) ) . map ( drop)
391
+ pub unsafe fn munlock ( addr : NonNull < c_void > , length : size_t ) -> Result < ( ) > {
392
+ Errno :: result ( libc:: munlock ( addr. as_ptr ( ) , length) ) . map ( drop)
395
393
}
396
394
397
395
/// Locks all memory pages mapped into this process' address space.
@@ -430,7 +428,7 @@ pub unsafe fn mmap<F: AsFd>(
430
428
flags : MapFlags ,
431
429
f : F ,
432
430
offset : off_t ,
433
- ) -> Result < * mut c_void > {
431
+ ) -> Result < NonNull < c_void > > {
434
432
let ptr = addr. map_or ( std:: ptr:: null_mut ( ) , |a| a. get ( ) as * mut c_void ) ;
435
433
436
434
let fd = f. as_fd ( ) . as_raw_fd ( ) ;
@@ -439,9 +437,12 @@ pub unsafe fn mmap<F: AsFd>(
439
437
440
438
if ret == libc:: MAP_FAILED {
441
439
Err ( Errno :: last ( ) )
442
- } else {
443
- Ok ( ret)
444
440
}
441
+ else {
442
+ // SAFETY: `libc::mmap` returns a valid non-null pointer or `libc::MAP_FAILED`, thus `ret`
443
+ // will be non-null here.
444
+ Ok ( unsafe { NonNull :: new_unchecked ( ret) } )
445
+ }
445
446
}
446
447
447
448
/// Create an anonymous memory mapping.
@@ -459,7 +460,7 @@ pub unsafe fn mmap_anonymous(
459
460
length : NonZeroUsize ,
460
461
prot : ProtFlags ,
461
462
flags : MapFlags ,
462
- ) -> Result < * mut c_void > {
463
+ ) -> Result < NonNull < c_void > > {
463
464
let ptr = addr. map_or ( std:: ptr:: null_mut ( ) , |a| a. get ( ) as * mut c_void ) ;
464
465
465
466
let flags = MapFlags :: MAP_ANONYMOUS | flags;
@@ -468,7 +469,9 @@ pub unsafe fn mmap_anonymous(
468
469
if ret == libc:: MAP_FAILED {
469
470
Err ( Errno :: last ( ) )
470
471
} else {
471
- Ok ( ret)
472
+ // SAFETY: `libc::mmap` returns a valid non-null pointer or `libc::MAP_FAILED`, thus `ret`
473
+ // will be non-null here.
474
+ Ok ( unsafe { NonNull :: new_unchecked ( ret) } )
472
475
}
473
476
}
474
477
@@ -481,33 +484,35 @@ pub unsafe fn mmap_anonymous(
481
484
/// detailed requirements.
482
485
#[ cfg( any( target_os = "linux" , target_os = "netbsd" ) ) ]
483
486
pub unsafe fn mremap (
484
- addr : * mut c_void ,
487
+ addr : NonNull < c_void > ,
485
488
old_size : size_t ,
486
489
new_size : size_t ,
487
490
flags : MRemapFlags ,
488
- new_address : Option < * mut c_void > ,
489
- ) -> Result < * mut c_void > {
491
+ new_address : Option < NonNull < c_void > > ,
492
+ ) -> Result < NonNull < c_void > > {
490
493
#[ cfg( target_os = "linux" ) ]
491
494
let ret = libc:: mremap (
492
- addr,
495
+ addr. as_ptr ( ) ,
493
496
old_size,
494
497
new_size,
495
498
flags. bits ( ) ,
496
- new_address. unwrap_or ( std:: ptr:: null_mut ( ) ) ,
499
+ new_address. map ( NonNull :: as_ptr ) . unwrap_or ( std:: ptr:: null_mut ( ) ) ,
497
500
) ;
498
501
#[ cfg( target_os = "netbsd" ) ]
499
502
let ret = libc:: mremap (
500
- addr,
503
+ addr. as_ptr ( ) ,
501
504
old_size,
502
- new_address. unwrap_or ( std:: ptr:: null_mut ( ) ) ,
505
+ new_address. map ( NonNull :: as_ptr ) . unwrap_or ( std:: ptr:: null_mut ( ) ) ,
503
506
new_size,
504
507
flags. bits ( ) ,
505
508
) ;
506
509
507
510
if ret == libc:: MAP_FAILED {
508
511
Err ( Errno :: last ( ) )
509
512
} else {
510
- Ok ( ret)
513
+ // SAFETY: `libc::mremap` returns a valid non-null pointer or `libc::MAP_FAILED`, thus `ret`
514
+ // will be non-null here.
515
+ Ok ( unsafe { NonNull :: new_unchecked ( ret) } )
511
516
}
512
517
}
513
518
@@ -519,8 +524,8 @@ pub unsafe fn mremap(
519
524
/// page.
520
525
///
521
526
/// [`munmap(2)`]: https://man7.org/linux/man-pages/man2/munmap.2.html
522
- pub unsafe fn munmap ( addr : * mut c_void , len : size_t ) -> Result < ( ) > {
523
- Errno :: result ( libc:: munmap ( addr, len) ) . map ( drop)
527
+ pub unsafe fn munmap ( addr : NonNull < c_void > , len : size_t ) -> Result < ( ) > {
528
+ Errno :: result ( libc:: munmap ( addr. as_ptr ( ) , len) ) . map ( drop)
524
529
}
525
530
526
531
/// give advice about use of memory
@@ -532,11 +537,11 @@ pub unsafe fn munmap(addr: *mut c_void, len: size_t) -> Result<()> {
532
537
///
533
538
/// [`madvise(2)`]: https://man7.org/linux/man-pages/man2/madvise.2.html
534
539
pub unsafe fn madvise (
535
- addr : * mut c_void ,
540
+ addr : NonNull < c_void > ,
536
541
length : size_t ,
537
542
advise : MmapAdvise ,
538
543
) -> Result < ( ) > {
539
- Errno :: result ( libc:: madvise ( addr, length, advise as i32 ) ) . map ( drop)
544
+ Errno :: result ( libc:: madvise ( addr. as_ptr ( ) , length, advise as i32 ) ) . map ( drop)
540
545
}
541
546
542
547
/// Set protection of memory mapping.
@@ -560,18 +565,18 @@ pub unsafe fn madvise(
560
565
/// let mem = mmap_anonymous(None, one_k_non_zero, ProtFlags::PROT_NONE, MapFlags::MAP_PRIVATE)
561
566
/// .unwrap();
562
567
/// mprotect(mem, ONE_K, ProtFlags::PROT_READ | ProtFlags::PROT_WRITE).unwrap();
563
- /// std::slice::from_raw_parts_mut(mem as *mut u8 , ONE_K)
568
+ /// std::slice::from_raw_parts_mut(mem.as_ptr().cast() , ONE_K)
564
569
/// };
565
570
/// assert_eq!(slice[0], 0x00);
566
571
/// slice[0] = 0xFF;
567
572
/// assert_eq!(slice[0], 0xFF);
568
573
/// ```
569
574
pub unsafe fn mprotect (
570
- addr : * mut c_void ,
575
+ addr : NonNull < c_void > ,
571
576
length : size_t ,
572
577
prot : ProtFlags ,
573
578
) -> Result < ( ) > {
574
- Errno :: result ( libc:: mprotect ( addr, length, prot. bits ( ) ) ) . map ( drop)
579
+ Errno :: result ( libc:: mprotect ( addr. as_ptr ( ) , length, prot. bits ( ) ) ) . map ( drop)
575
580
}
576
581
577
582
/// synchronize a mapped region
@@ -583,11 +588,11 @@ pub unsafe fn mprotect(
583
588
///
584
589
/// [`msync(2)`]: https://man7.org/linux/man-pages/man2/msync.2.html
585
590
pub unsafe fn msync (
586
- addr : * mut c_void ,
591
+ addr : NonNull < c_void > ,
587
592
length : size_t ,
588
593
flags : MsFlags ,
589
594
) -> Result < ( ) > {
590
- Errno :: result ( libc:: msync ( addr, length, flags. bits ( ) ) ) . map ( drop)
595
+ Errno :: result ( libc:: msync ( addr. as_ptr ( ) , length, flags. bits ( ) ) ) . map ( drop)
591
596
}
592
597
593
598
#[ cfg( not( target_os = "android" ) ) ]
0 commit comments