1 use nix::sys::mman::{mmap, MapFlags, ProtFlags};
2 
3 #[test]
test_mmap_anonymous()4 fn test_mmap_anonymous() {
5     unsafe {
6         let ptr = mmap(std::ptr::null_mut(), 1,
7                        ProtFlags::PROT_READ | ProtFlags::PROT_WRITE,
8                        MapFlags::MAP_PRIVATE | MapFlags::MAP_ANONYMOUS, -1, 0)
9                       .unwrap() as *mut u8;
10         assert_eq !(*ptr, 0x00u8);
11         *ptr = 0xffu8;
12         assert_eq !(*ptr, 0xffu8);
13     }
14 }
15 
16 #[test]
17 #[cfg(any(target_os = "linux", target_os = "netbsd"))]
test_mremap_grow()18 fn test_mremap_grow() {
19     use nix::sys::mman::{mremap, MRemapFlags};
20     use nix::libc::{c_void, size_t};
21 
22     const ONE_K : size_t = 1024;
23     let slice : &mut[u8] = unsafe {
24         let mem = mmap(std::ptr::null_mut(), ONE_K,
25                        ProtFlags::PROT_READ | ProtFlags::PROT_WRITE,
26                        MapFlags::MAP_ANONYMOUS | MapFlags::MAP_PRIVATE, -1, 0)
27                       .unwrap();
28         std::slice::from_raw_parts_mut(mem as * mut u8, ONE_K)
29     };
30     assert_eq !(slice[ONE_K - 1], 0x00);
31     slice[ONE_K - 1] = 0xFF;
32     assert_eq !(slice[ONE_K - 1], 0xFF);
33 
34     let slice : &mut[u8] = unsafe {
35         #[cfg(target_os = "linux")]
36         let mem = mremap(slice.as_mut_ptr() as * mut c_void, ONE_K, 10 * ONE_K,
37                          MRemapFlags::MREMAP_MAYMOVE, None)
38                       .unwrap();
39         #[cfg(target_os = "netbsd")]
40         let mem = mremap(slice.as_mut_ptr() as * mut c_void, ONE_K, 10 * ONE_K,
41                          MRemapFlags::MAP_REMAPDUP, None)
42                       .unwrap();
43         std::slice::from_raw_parts_mut(mem as * mut u8, 10 * ONE_K)
44     };
45 
46     // The first KB should still have the old data in it.
47     assert_eq !(slice[ONE_K - 1], 0xFF);
48 
49     // The additional range should be zero-init'd and accessible.
50     assert_eq !(slice[10 * ONE_K - 1], 0x00);
51     slice[10 * ONE_K - 1] = 0xFF;
52     assert_eq !(slice[10 * ONE_K - 1], 0xFF);
53 }
54 
55 #[test]
56 #[cfg(any(target_os = "linux", target_os = "netbsd"))]
57 // Segfaults for unknown reasons under QEMU for 32-bit targets
58 #[cfg_attr(all(target_pointer_width = "32", qemu), ignore)]
test_mremap_shrink()59 fn test_mremap_shrink() {
60     use nix::sys::mman::{mremap, MRemapFlags};
61     use nix::libc::{c_void, size_t};
62 
63     const ONE_K : size_t = 1024;
64     let slice : &mut[u8] = unsafe {
65         let mem = mmap(std::ptr::null_mut(), 10 * ONE_K,
66                        ProtFlags::PROT_READ | ProtFlags::PROT_WRITE,
67                        MapFlags::MAP_ANONYMOUS | MapFlags::MAP_PRIVATE, -1, 0)
68                       .unwrap();
69         std::slice::from_raw_parts_mut(mem as * mut u8, ONE_K)
70     };
71     assert_eq !(slice[ONE_K - 1], 0x00);
72     slice[ONE_K - 1] = 0xFF;
73     assert_eq !(slice[ONE_K - 1], 0xFF);
74 
75     let slice : &mut[u8] = unsafe {
76         #[cfg(target_os = "linux")]
77         let mem = mremap(slice.as_mut_ptr() as * mut c_void, 10 * ONE_K, ONE_K,
78                          MRemapFlags::empty(), None)
79                       .unwrap();
80         // Since we didn't supply MREMAP_MAYMOVE, the address should be the
81         // same.
82         #[cfg(target_os = "netbsd")]
83         let mem = mremap(slice.as_mut_ptr() as * mut c_void, 10 * ONE_K, ONE_K,
84                          MRemapFlags::MAP_FIXED, None)
85                       .unwrap();
86         assert_eq !(mem, slice.as_mut_ptr() as * mut c_void);
87         std::slice::from_raw_parts_mut(mem as * mut u8, ONE_K)
88     };
89 
90     // The first KB should still be accessible and have the old data in it.
91     assert_eq !(slice[ONE_K - 1], 0xFF);
92 }
93