xref: /linux/tools/testing/selftests/filesystems/overlayfs/set_layers_via_fds.c (revision fd101da676362aaa051b4f5d8a941bd308603041)
1 // SPDX-License-Identifier: GPL-2.0
2 #define _GNU_SOURCE
3 #define __SANE_USERSPACE_TYPES__ // Use ll64
4 
5 #include <fcntl.h>
6 #include <sched.h>
7 #include <stdio.h>
8 #include <string.h>
9 #include <sys/stat.h>
10 #include <sys/mount.h>
11 #include <unistd.h>
12 
13 #include "../../kselftest_harness.h"
14 #include "log.h"
15 #include "wrappers.h"
16 
17 FIXTURE(set_layers_via_fds) {
18 };
19 
20 FIXTURE_SETUP(set_layers_via_fds)
21 {
22 	ASSERT_EQ(mkdir("/set_layers_via_fds", 0755), 0);
23 	ASSERT_EQ(mkdir("/set_layers_via_fds_tmpfs", 0755), 0);
24 }
25 
26 FIXTURE_TEARDOWN(set_layers_via_fds)
27 {
28 	umount2("/set_layers_via_fds", 0);
29 	ASSERT_EQ(rmdir("/set_layers_via_fds"), 0);
30 
31 	umount2("/set_layers_via_fds_tmpfs", 0);
32 	ASSERT_EQ(rmdir("/set_layers_via_fds_tmpfs"), 0);
33 }
34 
35 TEST_F(set_layers_via_fds, set_layers_via_fds)
36 {
37 	int fd_context, fd_tmpfs, fd_overlay;
38 	int layer_fds[] = { [0 ... 8] = -EBADF };
39 	bool layers_found[] = { [0 ... 8] =  false };
40 	size_t len = 0;
41 	char *line = NULL;
42 	FILE *f_mountinfo;
43 
44 	ASSERT_EQ(unshare(CLONE_NEWNS), 0);
45 	ASSERT_EQ(sys_mount(NULL, "/", NULL, MS_SLAVE | MS_REC, NULL), 0);
46 
47 	fd_context = sys_fsopen("tmpfs", 0);
48 	ASSERT_GE(fd_context, 0);
49 
50 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_CMD_CREATE, NULL, NULL, 0), 0);
51 	fd_tmpfs = sys_fsmount(fd_context, 0, 0);
52 	ASSERT_GE(fd_tmpfs, 0);
53 	ASSERT_EQ(close(fd_context), 0);
54 
55 	ASSERT_EQ(mkdirat(fd_tmpfs, "w", 0755), 0);
56 	ASSERT_EQ(mkdirat(fd_tmpfs, "u", 0755), 0);
57 	ASSERT_EQ(mkdirat(fd_tmpfs, "l1", 0755), 0);
58 	ASSERT_EQ(mkdirat(fd_tmpfs, "l2", 0755), 0);
59 	ASSERT_EQ(mkdirat(fd_tmpfs, "l3", 0755), 0);
60 	ASSERT_EQ(mkdirat(fd_tmpfs, "l4", 0755), 0);
61 	ASSERT_EQ(mkdirat(fd_tmpfs, "d1", 0755), 0);
62 	ASSERT_EQ(mkdirat(fd_tmpfs, "d2", 0755), 0);
63 	ASSERT_EQ(mkdirat(fd_tmpfs, "d3", 0755), 0);
64 
65 	layer_fds[0] = openat(fd_tmpfs, "w", O_DIRECTORY);
66 	ASSERT_GE(layer_fds[0], 0);
67 
68 	layer_fds[1] = openat(fd_tmpfs, "u", O_DIRECTORY);
69 	ASSERT_GE(layer_fds[1], 0);
70 
71 	layer_fds[2] = openat(fd_tmpfs, "l1", O_DIRECTORY);
72 	ASSERT_GE(layer_fds[2], 0);
73 
74 	layer_fds[3] = openat(fd_tmpfs, "l2", O_DIRECTORY);
75 	ASSERT_GE(layer_fds[3], 0);
76 
77 	layer_fds[4] = openat(fd_tmpfs, "l3", O_DIRECTORY);
78 	ASSERT_GE(layer_fds[4], 0);
79 
80 	layer_fds[5] = openat(fd_tmpfs, "l4", O_DIRECTORY);
81 	ASSERT_GE(layer_fds[5], 0);
82 
83 	layer_fds[6] = openat(fd_tmpfs, "d1", O_DIRECTORY);
84 	ASSERT_GE(layer_fds[6], 0);
85 
86 	layer_fds[7] = openat(fd_tmpfs, "d2", O_DIRECTORY);
87 	ASSERT_GE(layer_fds[7], 0);
88 
89 	layer_fds[8] = openat(fd_tmpfs, "d3", O_DIRECTORY);
90 	ASSERT_GE(layer_fds[8], 0);
91 
92 	ASSERT_EQ(sys_move_mount(fd_tmpfs, "", -EBADF, "/tmp", MOVE_MOUNT_F_EMPTY_PATH), 0);
93 	ASSERT_EQ(close(fd_tmpfs), 0);
94 
95 	fd_context = sys_fsopen("overlay", 0);
96 	ASSERT_GE(fd_context, 0);
97 
98 	ASSERT_NE(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "lowerdir", NULL, layer_fds[2]), 0);
99 
100 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "workdir",   NULL, layer_fds[0]), 0);
101 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "upperdir",  NULL, layer_fds[1]), 0);
102 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "lowerdir+", NULL, layer_fds[2]), 0);
103 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "lowerdir+", NULL, layer_fds[3]), 0);
104 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "lowerdir+", NULL, layer_fds[4]), 0);
105 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "lowerdir+", NULL, layer_fds[5]), 0);
106 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "datadir+",  NULL, layer_fds[6]), 0);
107 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "datadir+",  NULL, layer_fds[7]), 0);
108 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "datadir+",  NULL, layer_fds[8]), 0);
109 
110 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_STRING, "metacopy", "on", 0), 0);
111 
112 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_CMD_CREATE, NULL, NULL, 0), 0);
113 
114 	fd_overlay = sys_fsmount(fd_context, 0, 0);
115 	ASSERT_GE(fd_overlay, 0);
116 
117 	ASSERT_EQ(sys_move_mount(fd_overlay, "", -EBADF, "/set_layers_via_fds", MOVE_MOUNT_F_EMPTY_PATH), 0);
118 
119 	f_mountinfo = fopen("/proc/self/mountinfo", "r");
120 	ASSERT_NE(f_mountinfo, NULL);
121 
122 	while (getline(&line, &len, f_mountinfo) != -1) {
123 		char *haystack = line;
124 
125 		if (strstr(haystack, "workdir=/tmp/w"))
126 			layers_found[0] = true;
127 		if (strstr(haystack, "upperdir=/tmp/u"))
128 			layers_found[1] = true;
129 		if (strstr(haystack, "lowerdir+=/tmp/l1"))
130 			layers_found[2] = true;
131 		if (strstr(haystack, "lowerdir+=/tmp/l2"))
132 			layers_found[3] = true;
133 		if (strstr(haystack, "lowerdir+=/tmp/l3"))
134 			layers_found[4] = true;
135 		if (strstr(haystack, "lowerdir+=/tmp/l4"))
136 			layers_found[5] = true;
137 		if (strstr(haystack, "datadir+=/tmp/d1"))
138 			layers_found[6] = true;
139 		if (strstr(haystack, "datadir+=/tmp/d2"))
140 			layers_found[7] = true;
141 		if (strstr(haystack, "datadir+=/tmp/d3"))
142 			layers_found[8] = true;
143 	}
144 	free(line);
145 
146 	for (int i = 0; i < ARRAY_SIZE(layer_fds); i++) {
147 		ASSERT_EQ(layers_found[i], true);
148 		ASSERT_EQ(close(layer_fds[i]), 0);
149 	}
150 
151 	ASSERT_EQ(close(fd_context), 0);
152 	ASSERT_EQ(close(fd_overlay), 0);
153 	ASSERT_EQ(fclose(f_mountinfo), 0);
154 }
155 
156 TEST_F(set_layers_via_fds, set_500_layers_via_fds)
157 {
158 	int fd_context, fd_tmpfs, fd_overlay, fd_work, fd_upper, fd_lower;
159 	int layer_fds[500] = { [0 ... 499] = -EBADF };
160 
161 	ASSERT_EQ(unshare(CLONE_NEWNS), 0);
162 	ASSERT_EQ(sys_mount(NULL, "/", NULL, MS_SLAVE | MS_REC, NULL), 0);
163 
164 	fd_context = sys_fsopen("tmpfs", 0);
165 	ASSERT_GE(fd_context, 0);
166 
167 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_CMD_CREATE, NULL, NULL, 0), 0);
168 	fd_tmpfs = sys_fsmount(fd_context, 0, 0);
169 	ASSERT_GE(fd_tmpfs, 0);
170 	ASSERT_EQ(close(fd_context), 0);
171 
172 	for (int i = 0; i < ARRAY_SIZE(layer_fds); i++) {
173 		char path[100];
174 
175 		sprintf(path, "l%d", i);
176 		ASSERT_EQ(mkdirat(fd_tmpfs, path, 0755), 0);
177 		layer_fds[i] = openat(fd_tmpfs, path, O_DIRECTORY);
178 		ASSERT_GE(layer_fds[i], 0);
179 	}
180 
181 	ASSERT_EQ(mkdirat(fd_tmpfs, "w", 0755), 0);
182 	fd_work = openat(fd_tmpfs, "w", O_DIRECTORY);
183 	ASSERT_GE(fd_work, 0);
184 
185 	ASSERT_EQ(mkdirat(fd_tmpfs, "u", 0755), 0);
186 	fd_upper = openat(fd_tmpfs, "u", O_DIRECTORY);
187 	ASSERT_GE(fd_upper, 0);
188 
189 	ASSERT_EQ(mkdirat(fd_tmpfs, "l501", 0755), 0);
190 	fd_lower = openat(fd_tmpfs, "l501", O_DIRECTORY);
191 	ASSERT_GE(fd_lower, 0);
192 
193 	ASSERT_EQ(sys_move_mount(fd_tmpfs, "", -EBADF, "/tmp", MOVE_MOUNT_F_EMPTY_PATH), 0);
194 	ASSERT_EQ(close(fd_tmpfs), 0);
195 
196 	fd_context = sys_fsopen("overlay", 0);
197 	ASSERT_GE(fd_context, 0);
198 
199 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "workdir",   NULL, fd_work), 0);
200 	ASSERT_EQ(close(fd_work), 0);
201 
202 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "upperdir",  NULL, fd_upper), 0);
203 	ASSERT_EQ(close(fd_upper), 0);
204 
205 	for (int i = 0; i < ARRAY_SIZE(layer_fds); i++) {
206 		ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "lowerdir+", NULL, layer_fds[i]), 0);
207 		ASSERT_EQ(close(layer_fds[i]), 0);
208 	}
209 
210 	ASSERT_NE(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "lowerdir+", NULL, fd_lower), 0);
211 	ASSERT_EQ(close(fd_lower), 0);
212 
213 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_CMD_CREATE, NULL, NULL, 0), 0);
214 
215 	fd_overlay = sys_fsmount(fd_context, 0, 0);
216 	ASSERT_GE(fd_overlay, 0);
217 	ASSERT_EQ(close(fd_context), 0);
218 	ASSERT_EQ(close(fd_overlay), 0);
219 }
220 
221 TEST_F(set_layers_via_fds, set_500_layers_via_opath_fds)
222 {
223 	int fd_context, fd_tmpfs, fd_overlay, fd_work, fd_upper, fd_lower;
224 	int layer_fds[500] = { [0 ... 499] = -EBADF };
225 
226 	ASSERT_EQ(unshare(CLONE_NEWNS), 0);
227 	ASSERT_EQ(sys_mount(NULL, "/", NULL, MS_SLAVE | MS_REC, NULL), 0);
228 
229 	fd_context = sys_fsopen("tmpfs", 0);
230 	ASSERT_GE(fd_context, 0);
231 
232 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_CMD_CREATE, NULL, NULL, 0), 0);
233 	fd_tmpfs = sys_fsmount(fd_context, 0, 0);
234 	ASSERT_GE(fd_tmpfs, 0);
235 	ASSERT_EQ(close(fd_context), 0);
236 
237 	for (int i = 0; i < ARRAY_SIZE(layer_fds); i++) {
238 		char path[100];
239 
240 		sprintf(path, "l%d", i);
241 		ASSERT_EQ(mkdirat(fd_tmpfs, path, 0755), 0);
242 		layer_fds[i] = openat(fd_tmpfs, path, O_DIRECTORY | O_PATH);
243 		ASSERT_GE(layer_fds[i], 0);
244 	}
245 
246 	ASSERT_EQ(mkdirat(fd_tmpfs, "w", 0755), 0);
247 	fd_work = openat(fd_tmpfs, "w", O_DIRECTORY | O_PATH);
248 	ASSERT_GE(fd_work, 0);
249 
250 	ASSERT_EQ(mkdirat(fd_tmpfs, "u", 0755), 0);
251 	fd_upper = openat(fd_tmpfs, "u", O_DIRECTORY | O_PATH);
252 	ASSERT_GE(fd_upper, 0);
253 
254 	ASSERT_EQ(mkdirat(fd_tmpfs, "l501", 0755), 0);
255 	fd_lower = openat(fd_tmpfs, "l501", O_DIRECTORY | O_PATH);
256 	ASSERT_GE(fd_lower, 0);
257 
258 	ASSERT_EQ(sys_move_mount(fd_tmpfs, "", -EBADF, "/tmp", MOVE_MOUNT_F_EMPTY_PATH), 0);
259 	ASSERT_EQ(close(fd_tmpfs), 0);
260 
261 	fd_context = sys_fsopen("overlay", 0);
262 	ASSERT_GE(fd_context, 0);
263 
264 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "workdir",   NULL, fd_work), 0);
265 	ASSERT_EQ(close(fd_work), 0);
266 
267 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "upperdir",  NULL, fd_upper), 0);
268 	ASSERT_EQ(close(fd_upper), 0);
269 
270 	for (int i = 0; i < ARRAY_SIZE(layer_fds); i++) {
271 		ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "lowerdir+", NULL, layer_fds[i]), 0);
272 		ASSERT_EQ(close(layer_fds[i]), 0);
273 	}
274 
275 	ASSERT_NE(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "lowerdir+", NULL, fd_lower), 0);
276 	ASSERT_EQ(close(fd_lower), 0);
277 
278 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_CMD_CREATE, NULL, NULL, 0), 0);
279 
280 	fd_overlay = sys_fsmount(fd_context, 0, 0);
281 	ASSERT_GE(fd_overlay, 0);
282 	ASSERT_EQ(close(fd_context), 0);
283 	ASSERT_EQ(close(fd_overlay), 0);
284 }
285 
286 TEST_F(set_layers_via_fds, set_layers_via_detached_mount_fds)
287 {
288 	int fd_context, fd_tmpfs, fd_overlay, fd_tmp;
289 	int layer_fds[] = { [0 ... 8] = -EBADF };
290 	bool layers_found[] = { [0 ... 8] =  false };
291 	size_t len = 0;
292 	char *line = NULL;
293 	FILE *f_mountinfo;
294 
295 	ASSERT_EQ(unshare(CLONE_NEWNS), 0);
296 	ASSERT_EQ(sys_mount(NULL, "/", NULL, MS_SLAVE | MS_REC, NULL), 0);
297 
298 	fd_context = sys_fsopen("tmpfs", 0);
299 	ASSERT_GE(fd_context, 0);
300 
301 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_CMD_CREATE, NULL, NULL, 0), 0);
302 	fd_tmpfs = sys_fsmount(fd_context, 0, 0);
303 	ASSERT_GE(fd_tmpfs, 0);
304 	ASSERT_EQ(close(fd_context), 0);
305 
306 	ASSERT_EQ(mkdirat(fd_tmpfs, "u", 0755), 0);
307 	ASSERT_EQ(mkdirat(fd_tmpfs, "u/upper", 0755), 0);
308 	ASSERT_EQ(mkdirat(fd_tmpfs, "u/work", 0755), 0);
309 	ASSERT_EQ(mkdirat(fd_tmpfs, "l1", 0755), 0);
310 	ASSERT_EQ(mkdirat(fd_tmpfs, "l2", 0755), 0);
311 	ASSERT_EQ(mkdirat(fd_tmpfs, "l3", 0755), 0);
312 	ASSERT_EQ(mkdirat(fd_tmpfs, "l4", 0755), 0);
313 	ASSERT_EQ(mkdirat(fd_tmpfs, "d1", 0755), 0);
314 	ASSERT_EQ(mkdirat(fd_tmpfs, "d2", 0755), 0);
315 	ASSERT_EQ(mkdirat(fd_tmpfs, "d3", 0755), 0);
316 
317 	ASSERT_EQ(sys_move_mount(fd_tmpfs, "", -EBADF, "/set_layers_via_fds_tmpfs", MOVE_MOUNT_F_EMPTY_PATH), 0);
318 
319 	fd_tmp = open_tree(fd_tmpfs, "u", OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC);
320 	ASSERT_GE(fd_tmp, 0);
321 
322 	layer_fds[0] = openat(fd_tmp, "upper", O_CLOEXEC | O_DIRECTORY | O_PATH);
323 	ASSERT_GE(layer_fds[0], 0);
324 
325 	layer_fds[1] = openat(fd_tmp, "work", O_CLOEXEC | O_DIRECTORY | O_PATH);
326 	ASSERT_GE(layer_fds[1], 0);
327 
328 	layer_fds[2] = open_tree(fd_tmpfs, "l1", OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC);
329 	ASSERT_GE(layer_fds[2], 0);
330 
331 	layer_fds[3] = open_tree(fd_tmpfs, "l2", OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC);
332 	ASSERT_GE(layer_fds[3], 0);
333 
334 	layer_fds[4] = open_tree(fd_tmpfs, "l3", OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC);
335 	ASSERT_GE(layer_fds[4], 0);
336 
337 	layer_fds[5] = open_tree(fd_tmpfs, "l4", OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC);
338 	ASSERT_GE(layer_fds[5], 0);
339 
340 	layer_fds[6] = open_tree(fd_tmpfs, "d1", OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC);
341 	ASSERT_GE(layer_fds[6], 0);
342 
343 	layer_fds[7] = open_tree(fd_tmpfs, "d2", OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC);
344 	ASSERT_GE(layer_fds[7], 0);
345 
346 	layer_fds[8] = open_tree(fd_tmpfs, "d3", OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC);
347 	ASSERT_GE(layer_fds[8], 0);
348 
349 	ASSERT_EQ(close(fd_tmpfs), 0);
350 
351 	fd_context = sys_fsopen("overlay", 0);
352 	ASSERT_GE(fd_context, 0);
353 
354 	ASSERT_NE(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "lowerdir", NULL, layer_fds[2]), 0);
355 
356 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "upperdir",  NULL, layer_fds[0]), 0);
357 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "workdir",   NULL, layer_fds[1]), 0);
358 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "lowerdir+", NULL, layer_fds[2]), 0);
359 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "lowerdir+", NULL, layer_fds[3]), 0);
360 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "lowerdir+", NULL, layer_fds[4]), 0);
361 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "lowerdir+", NULL, layer_fds[5]), 0);
362 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "datadir+",  NULL, layer_fds[6]), 0);
363 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "datadir+",  NULL, layer_fds[7]), 0);
364 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_FD, "datadir+",  NULL, layer_fds[8]), 0);
365 
366 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_SET_STRING, "metacopy", "on", 0), 0);
367 
368 	ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_CMD_CREATE, NULL, NULL, 0), 0);
369 
370 	fd_overlay = sys_fsmount(fd_context, 0, 0);
371 	ASSERT_GE(fd_overlay, 0);
372 
373 	ASSERT_EQ(sys_move_mount(fd_overlay, "", -EBADF, "/set_layers_via_fds", MOVE_MOUNT_F_EMPTY_PATH), 0);
374 
375 	f_mountinfo = fopen("/proc/self/mountinfo", "r");
376 	ASSERT_NE(f_mountinfo, NULL);
377 
378 	while (getline(&line, &len, f_mountinfo) != -1) {
379 		char *haystack = line;
380 
381 		if (strstr(haystack, "workdir=/tmp/w"))
382 			layers_found[0] = true;
383 		if (strstr(haystack, "upperdir=/tmp/u"))
384 			layers_found[1] = true;
385 		if (strstr(haystack, "lowerdir+=/tmp/l1"))
386 			layers_found[2] = true;
387 		if (strstr(haystack, "lowerdir+=/tmp/l2"))
388 			layers_found[3] = true;
389 		if (strstr(haystack, "lowerdir+=/tmp/l3"))
390 			layers_found[4] = true;
391 		if (strstr(haystack, "lowerdir+=/tmp/l4"))
392 			layers_found[5] = true;
393 		if (strstr(haystack, "datadir+=/tmp/d1"))
394 			layers_found[6] = true;
395 		if (strstr(haystack, "datadir+=/tmp/d2"))
396 			layers_found[7] = true;
397 		if (strstr(haystack, "datadir+=/tmp/d3"))
398 			layers_found[8] = true;
399 	}
400 	free(line);
401 
402 	for (int i = 0; i < ARRAY_SIZE(layer_fds); i++) {
403 		ASSERT_EQ(layers_found[i], true);
404 		ASSERT_EQ(close(layer_fds[i]), 0);
405 	}
406 
407 	ASSERT_EQ(close(fd_context), 0);
408 	ASSERT_EQ(close(fd_overlay), 0);
409 	ASSERT_EQ(fclose(f_mountinfo), 0);
410 }
411 
412 TEST_HARNESS_MAIN
413