xref: /xnu-8792.81.2/tests/vfs/o_search.c (revision 19c3b8c28c31cb8130e034cfb5df6bf9ba342d90)
1*19c3b8c2SApple OSS Distributions /* compile: xcrun -sdk macosx.internal clang -ldarwintest -o o_search o_search.c -g -Weverything */
2*19c3b8c2SApple OSS Distributions 
3*19c3b8c2SApple OSS Distributions #include <darwintest.h>
4*19c3b8c2SApple OSS Distributions #include <darwintest_utils.h>
5*19c3b8c2SApple OSS Distributions #include <darwintest_multiprocess.h>
6*19c3b8c2SApple OSS Distributions #include <errno.h>
7*19c3b8c2SApple OSS Distributions #include <stdint.h>
8*19c3b8c2SApple OSS Distributions #include <stdlib.h>
9*19c3b8c2SApple OSS Distributions #include <unistd.h>
10*19c3b8c2SApple OSS Distributions #include <sys/attr.h>
11*19c3b8c2SApple OSS Distributions #include <sys/event.h>
12*19c3b8c2SApple OSS Distributions #include <sys/resource.h>
13*19c3b8c2SApple OSS Distributions #include <dirent.h>
14*19c3b8c2SApple OSS Distributions 
15*19c3b8c2SApple OSS Distributions #ifndef O_EXEC
16*19c3b8c2SApple OSS Distributions #define O_EXEC 0x40000000
17*19c3b8c2SApple OSS Distributions #define O_SEARCH (O_EXEC | O_DIRECTORY)
18*19c3b8c2SApple OSS Distributions #endif
19*19c3b8c2SApple OSS Distributions 
20*19c3b8c2SApple OSS Distributions T_GLOBAL_META(
21*19c3b8c2SApple OSS Distributions 	T_META_NAMESPACE("xnu.vfs"),
22*19c3b8c2SApple OSS Distributions 	T_META_RADAR_COMPONENT_NAME("xnu"),
23*19c3b8c2SApple OSS Distributions 	T_META_RADAR_COMPONENT_VERSION("vfs"),
24*19c3b8c2SApple OSS Distributions 	T_META_ASROOT(false),
25*19c3b8c2SApple OSS Distributions 	T_META_CHECK_LEAKS(false));
26*19c3b8c2SApple OSS Distributions 
27*19c3b8c2SApple OSS Distributions #define TEST_FILE "testfile"
28*19c3b8c2SApple OSS Distributions #define NUMDIRS 5
29*19c3b8c2SApple OSS Distributions 
30*19c3b8c2SApple OSS Distributions static char g_testfile[MAXPATHLEN];
31*19c3b8c2SApple OSS Distributions 
32*19c3b8c2SApple OSS Distributions extern ssize_t __getdirentries64(int, void *, size_t, off_t *);
33*19c3b8c2SApple OSS Distributions 
34*19c3b8c2SApple OSS Distributions static void
exit_cleanup(void)35*19c3b8c2SApple OSS Distributions exit_cleanup(void)
36*19c3b8c2SApple OSS Distributions {
37*19c3b8c2SApple OSS Distributions 	(void)unlink(g_testfile);
38*19c3b8c2SApple OSS Distributions }
39*19c3b8c2SApple OSS Distributions 
40*19c3b8c2SApple OSS Distributions T_DECL(o_search,
41*19c3b8c2SApple OSS Distributions     "test O_SEARCH for open",
42*19c3b8c2SApple OSS Distributions     T_META_ASROOT(false))
43*19c3b8c2SApple OSS Distributions {
44*19c3b8c2SApple OSS Distributions 	const char *tmpdir = dt_tmpdir();
45*19c3b8c2SApple OSS Distributions 	void *mapped = MAP_FAILED;
46*19c3b8c2SApple OSS Distributions 	off_t dirbyte = 0;
47*19c3b8c2SApple OSS Distributions 	int retval = 0;
48*19c3b8c2SApple OSS Distributions 	int fd = -1;
49*19c3b8c2SApple OSS Distributions 	int tmpdir_fd = -1;
50*19c3b8c2SApple OSS Distributions 	char namebuf[(sizeof(struct dirent) * (NUMDIRS + 2))];
51*19c3b8c2SApple OSS Distributions 	char attrbuf[256];
52*19c3b8c2SApple OSS Distributions 
53*19c3b8c2SApple OSS Distributions 	T_SETUPBEGIN;
54*19c3b8c2SApple OSS Distributions 
55*19c3b8c2SApple OSS Distributions 	atexit(exit_cleanup);
56*19c3b8c2SApple OSS Distributions 
57*19c3b8c2SApple OSS Distributions 	T_ASSERT_POSIX_ZERO(chdir(tmpdir),
58*19c3b8c2SApple OSS Distributions 	    "Setup: changing to tmpdir: %s", tmpdir);
59*19c3b8c2SApple OSS Distributions 
60*19c3b8c2SApple OSS Distributions 	snprintf(g_testfile, MAXPATHLEN, "%s/%s", tmpdir, TEST_FILE);
61*19c3b8c2SApple OSS Distributions 
62*19c3b8c2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(fd = open(g_testfile, O_CREAT | O_RDWR, 0644), NULL);
63*19c3b8c2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(retval = (int)write(fd, g_testfile, sizeof(g_testfile)), "Write: %s", g_testfile);
64*19c3b8c2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(fd), "Close test file: %s", g_testfile);
65*19c3b8c2SApple OSS Distributions 
66*19c3b8c2SApple OSS Distributions 	T_SETUPEND;
67*19c3b8c2SApple OSS Distributions 
68*19c3b8c2SApple OSS Distributions 	T_WITH_ERRNO;
69*19c3b8c2SApple OSS Distributions 	tmpdir_fd = open(tmpdir, O_EXEC);
70*19c3b8c2SApple OSS Distributions 	T_ASSERT_TRUE((tmpdir_fd == -1) && (errno == EISDIR),
71*19c3b8c2SApple OSS Distributions 	    "Trying to open directory O_EXEC: %s, tmpdir_fd = %d, errno = %d", g_testfile, tmpdir_fd, errno);
72*19c3b8c2SApple OSS Distributions 
73*19c3b8c2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(tmpdir_fd = open(tmpdir, O_RDONLY), NULL);
74*19c3b8c2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(retval = (int)__getdirentries64(tmpdir_fd, namebuf, sizeof(namebuf), &dirbyte), NULL);
75*19c3b8c2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(tmpdir_fd), NULL);
76*19c3b8c2SApple OSS Distributions 
77*19c3b8c2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(tmpdir_fd = open(tmpdir, O_SEARCH), NULL);
78*19c3b8c2SApple OSS Distributions 	retval = (int)__getdirentries64(tmpdir_fd, namebuf, sizeof(namebuf), &dirbyte);
79*19c3b8c2SApple OSS Distributions 	T_ASSERT_TRUE((retval == -1) && (errno == EBADF),
80*19c3b8c2SApple OSS Distributions 	    "Trying to read directory opened with O_SEARCH: %s, retval = %d, errno = %d",
81*19c3b8c2SApple OSS Distributions 	    tmpdir, retval, errno);
82*19c3b8c2SApple OSS Distributions 
83*19c3b8c2SApple OSS Distributions 	fd = openat(tmpdir_fd, TEST_FILE, O_EXEC);
84*19c3b8c2SApple OSS Distributions 	T_ASSERT_TRUE((fd == -1) && (errno == EACCES),
85*19c3b8c2SApple OSS Distributions 	    "Trying to open file for execute with perms 644: %s, retval = %d, errno = %d",
86*19c3b8c2SApple OSS Distributions 	    tmpdir, retval, errno);
87*19c3b8c2SApple OSS Distributions 
88*19c3b8c2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(retval = fchmodat(tmpdir_fd, TEST_FILE, 0744, 0), NULL);
89*19c3b8c2SApple OSS Distributions 
90*19c3b8c2SApple OSS Distributions 	fd = openat(tmpdir_fd, TEST_FILE, O_SEARCH);
91*19c3b8c2SApple OSS Distributions 	T_ASSERT_TRUE((fd == -1) && (errno == ENOTDIR),
92*19c3b8c2SApple OSS Distributions 	    "Trying to open file for execute with perms 644: %s, retval = %d, errno = %d",
93*19c3b8c2SApple OSS Distributions 	    tmpdir, retval, errno);
94*19c3b8c2SApple OSS Distributions 
95*19c3b8c2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(fd = openat(tmpdir_fd, TEST_FILE, O_EXEC), NULL);
96*19c3b8c2SApple OSS Distributions 
97*19c3b8c2SApple OSS Distributions 	retval = (int)read(fd, &attrbuf, 2);
98*19c3b8c2SApple OSS Distributions 	T_ASSERT_TRUE((retval == -1) && (errno == EBADF),
99*19c3b8c2SApple OSS Distributions 	    "Trying to read file opened with O_EXEC: %s, retval = %d, errno = %d",
100*19c3b8c2SApple OSS Distributions 	    g_testfile, retval, errno);
101*19c3b8c2SApple OSS Distributions 
102*19c3b8c2SApple OSS Distributions 	retval = (int)write(fd, &attrbuf, 2);
103*19c3b8c2SApple OSS Distributions 	T_ASSERT_TRUE((retval == -1) && (errno == EBADF),
104*19c3b8c2SApple OSS Distributions 	    "Trying to write file opened with O_EXEC: %s, retval = %d, errno = %d",
105*19c3b8c2SApple OSS Distributions 	    g_testfile, retval, errno);
106*19c3b8c2SApple OSS Distributions 
107*19c3b8c2SApple OSS Distributions 	mapped = mmap(NULL, PAGE_SIZE, PROT_READ, MAP_SHARED,
108*19c3b8c2SApple OSS Distributions 	    fd, 0);
109*19c3b8c2SApple OSS Distributions 	T_ASSERT_TRUE((mapped == MAP_FAILED) && (errno == EACCES),
110*19c3b8c2SApple OSS Distributions 	    "Trying to mmap file for read opened with O_EXEC: %s, mapped = %ld, errno = %d",
111*19c3b8c2SApple OSS Distributions 	    g_testfile, (long)mapped, errno);
112*19c3b8c2SApple OSS Distributions 
113*19c3b8c2SApple OSS Distributions 	mapped = mmap(NULL, PAGE_SIZE, PROT_WRITE, MAP_SHARED,
114*19c3b8c2SApple OSS Distributions 	    fd, 0);
115*19c3b8c2SApple OSS Distributions 	T_ASSERT_TRUE((mapped == MAP_FAILED) && (errno == EACCES),
116*19c3b8c2SApple OSS Distributions 	    "Trying to mmap file for write opened with O_EXEC: %s, mapped = %ld, errno = %d",
117*19c3b8c2SApple OSS Distributions 	    g_testfile, (long)mapped, errno);
118*19c3b8c2SApple OSS Distributions 
119*19c3b8c2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(fd), NULL);
120*19c3b8c2SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(close(tmpdir_fd), NULL);
121*19c3b8c2SApple OSS Distributions }
122