1 
2 #include "mman.h"
3 
4 #include <errno.h>
5 #include <fcntl.h>
6 #include <sys/stat.h>
7 
8 #ifndef NULL
9 #define NULL    (void*)0
10 #endif
11 
12 const char* map_file_name = "map_file.dat";
13 
test_anon_map_readwrite()14 int test_anon_map_readwrite()
15 {
16     void* map = mmap(NULL, 1024, PROT_READ | PROT_WRITE,
17  		      MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
18     if (map == MAP_FAILED)
19     {
20         printf("mmap (MAP_ANONYMOUS, PROT_READ | PROT_WRITE) returned unexpected error: %d\n", errno);
21         return -1;
22     }
23 
24     *((unsigned char*)map) = 1;
25 
26     int result = munmap(map, 1024);
27 
28     if (result != 0)
29         printf("munmap (MAP_ANONYMOUS, PROT_READ | PROT_WRITE) returned unexpected error: %d\n", errno);
30 
31     return result;
32 }
33 
test_anon_map_readonly()34 int test_anon_map_readonly()
35 {
36     void* map = mmap(NULL, 1024, PROT_READ,
37  		      MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
38     if (map == MAP_FAILED)
39     {
40         printf("mmap (MAP_ANONYMOUS, PROT_READ) returned unexpected error: %d\n", errno);
41         return -1;
42     }
43 
44     *((unsigned char*)map) = 1;
45 
46     int result = munmap(map, 1024);
47 
48     if (result != 0)
49         printf("munmap (MAP_ANONYMOUS, PROT_READ) returned unexpected error: %d\n", errno);
50 
51     return result;
52 }
53 
test_anon_map_writeonly()54 int test_anon_map_writeonly()
55 {
56     void* map = mmap(NULL, 1024, PROT_WRITE,
57  		      MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
58     if (map == MAP_FAILED)
59     {
60         printf("mmap (MAP_ANONYMOUS, PROT_WRITE) returned unexpected error: %d\n", errno);
61         return -1;
62     }
63 
64     *((unsigned char*)map) = 1;
65 
66     int result = munmap(map, 1024);
67 
68     if (result != 0)
69         printf("munmap (MAP_ANONYMOUS, PROT_WRITE) returned unexpected error: %d\n", errno);
70 
71     return result;
72 }
73 
test_anon_map_readonly_nowrite()74 int test_anon_map_readonly_nowrite()
75 {
76     void* map = mmap(NULL, 1024, PROT_READ,
77  		      MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
78     if (map == MAP_FAILED)
79     {
80         printf("mmap (MAP_ANONYMOUS, PROT_READ) returned unexpected error: %d\n", errno);
81         return -1;
82     }
83 
84     if (*((unsigned char*)map) != 0)
85         printf("test_anon_map_readonly_nowrite (MAP_ANONYMOUS, PROT_READ) returned unexpected value: %d\n",
86                 (int)*((unsigned char*)map));
87 
88     int result = munmap(map, 1024);
89 
90     if (result != 0)
91         printf("munmap (MAP_ANONYMOUS, PROT_READ) returned unexpected error: %d\n", errno);
92 
93     return result;
94 }
95 
test_file_map_readwrite()96 int test_file_map_readwrite()
97 {
98     mode_t mode = S_IRUSR | S_IWUSR;
99     int o = open(map_file_name, O_TRUNC | O_BINARY | O_RDWR | O_CREAT, mode);
100 
101     void* map = mmap(NULL, 1024, PROT_READ | PROT_WRITE, MAP_PRIVATE, o, 0);
102     if (map == MAP_FAILED)
103     {
104         printf("mmap returned unexpected error: %d\n", errno);
105         return -1;
106     }
107 
108     *((unsigned char*)map) = 1;
109 
110     int result = munmap(map, 1024);
111 
112     if (result != 0)
113         printf("munmap returned unexpected error: %d\n", errno);
114 
115     close(o);
116 
117     /*TODO: get file info and content and compare it with the sources conditions */
118     unlink(map_file_name);
119 
120     return result;
121 }
122 
test_file_map_mlock_munlock()123 int test_file_map_mlock_munlock()
124 {
125     const size_t map_size = 1024;
126 
127     int result = 0;
128     mode_t mode = S_IRUSR | S_IWUSR;
129     int o = open(map_file_name, O_TRUNC | O_BINARY | O_RDWR | O_CREAT, mode);
130     if (o == -1)
131     {
132         printf("unable to create file %s: %d\n", map_file_name, errno);
133         return -1;
134     }
135 
136     void* map = mmap(NULL, map_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, o, 0);
137     if (map == MAP_FAILED)
138     {
139         printf("mmap returned unexpected error: %d\n", errno);
140         result = -1;
141         goto done_close;
142     }
143 
144     if (mlock(map, map_size) != 0)
145     {
146         printf("mlock returned unexpected error: %d\n", errno);
147         result = -1;
148         goto done_munmap;
149     }
150 
151     *((unsigned char*)map) = 1;
152 
153     if (munlock(map, map_size) != 0)
154     {
155         printf("munlock returned unexpected error: %d\n", errno);
156         result = -1;
157     }
158 
159 done_munmap:
160     result = munmap(map, map_size);
161 
162     if (result != 0)
163         printf("munmap returned unexpected error: %d\n", errno);
164 
165 done_close:
166     close(o);
167 
168     unlink(map_file_name);
169 done:
170     return result;
171 }
172 
test_file_map_msync()173 int test_file_map_msync()
174 {
175     const size_t map_size = 1024;
176 
177     int result = 0;
178     mode_t mode = S_IRUSR | S_IWUSR;
179     int o = open(map_file_name, O_TRUNC | O_BINARY | O_RDWR | O_CREAT, mode);
180     if (o == -1)
181     {
182         printf("unable to create file %s: %d\n", map_file_name, errno);
183         return -1;
184     }
185 
186     void* map = mmap(NULL, map_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, o, 0);
187     if (map == MAP_FAILED)
188     {
189         printf("mmap returned unexpected error: %d\n", errno);
190         result = -1;
191         goto done_close;
192     }
193 
194     *((unsigned char*)map) = 1;
195 
196     if (msync(map, map_size, MS_SYNC) != 0)
197     {
198         printf("msync returned unexpected error: %d\n", errno);
199         result = -1;
200     }
201 
202     result = munmap(map, map_size);
203 
204     if (result != 0)
205         printf("munmap returned unexpected error: %d\n", errno);
206 
207 done_close:
208     close(o);
209 
210     unlink(map_file_name);
211 done:
212     return result;
213 }
214 
215 #define EXEC_TEST(name) \
216     if (name() != 0) { result = -1; printf( #name ": fail\n"); } \
217     else { printf(#name ": pass\n"); }
218 
main()219 int main()
220 {
221     int result = 0;
222 
223     EXEC_TEST(test_anon_map_readwrite);
224     //NOTE: this test must cause an access violation exception
225     //EXEC_TEST(test_anon_map_readonly);
226     EXEC_TEST(test_anon_map_readonly_nowrite);
227     EXEC_TEST(test_anon_map_writeonly);
228 
229     EXEC_TEST(test_file_map_readwrite);
230     EXEC_TEST(test_file_map_mlock_munlock);
231     EXEC_TEST(test_file_map_msync);
232     //TODO: EXEC_TEST(test_file_map_mprotect);
233 
234     return result;
235 }
236