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