66//
77// ===----------------------------------------------------------------------===//
88
9- #include " src/fcntl/open.h"
109#include " src/__support/CPP/string.h"
10+ #include " src/fcntl/open.h"
1111#include " src/sys/stat/mkdir.h"
12- #include " src/unistd/faccessat.h"
1312#include " src/unistd/close.h"
14- #include " src/unistd/unlink.h"
15- #include " src/unistd/unlinkat.h"
16- #include " src/unistd/symlink.h"
13+ #include " src/unistd/faccessat.h"
1714#include " src/unistd/rmdir.h"
1815#include " src/unistd/symlink.h"
16+ #include " src/unistd/unlink.h"
17+ #include " src/unistd/unlinkat.h"
1918#include " test/UnitTest/ErrnoCheckingTest.h"
2019#include " test/UnitTest/ErrnoSetterMatcher.h"
2120#include " test/UnitTest/Test.h"
2221
23- #include < fcntl.h> // For AT_FDCWD, AT_EACCESS, AT_SYMLINK_NOFOLLOW
24- #include < sys/stat.h> // For S_IRWXU, S_IXUSR, etc.
25- #include < unistd.h> // For F_OK, R_OK, W_OK, X_OK
26-
22+ #include < fcntl.h>
23+ #include < sys/stat.h>
24+ #include < unistd.h>
2725
2826namespace {
2927
30- using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds ;
28+ namespace cpp = LIBC_NAMESPACE::cpp ;
3129using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
30+ using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
3231
32+ using LlvmLibcFaccessatTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;
3333
34- class LlvmLibcFaccessatTest : public LIBC_NAMESPACE ::testing::ErrnoCheckingTest {
35- public:
36- void create_test_dir (const char * dirname, int & dir_fd) {
37- auto TEST_DIR = libc_make_test_file_path (dirname);
38- ASSERT_THAT (LIBC_NAMESPACE::mkdir (TEST_DIR, S_IRWXU), Succeeds (0 ));
39-
40- dir_fd = LIBC_NAMESPACE::open (TEST_DIR, O_RDONLY | O_DIRECTORY);
41- ASSERT_ERRNO_SUCCESS ();
42- ASSERT_GT (dir_fd, 0 );
43- }
44-
45- void cleanup_test_dir (const char * dirname, int dir_fd) {
46- auto TEST_DIR = libc_make_test_file_path (dirname);
47- ASSERT_THAT (LIBC_NAMESPACE::close (dir_fd), Succeeds (0 ));
48- ASSERT_THAT (LIBC_NAMESPACE::rmdir (TEST_DIR), Succeeds (0 ));
49- }
50- };
51-
52-
53- TEST_F (LlvmLibcFaccessatTest, CreateAndTest_AT_FDCWD) {
54- // Test access checks on a file with AT_FDCWD, equivalent to access().
34+ TEST_F (LlvmLibcFaccessatTest, WithAtFdcwd) {
35+ // Test access checks on a file with AT_FDCWD and no flags, equivalent to
36+ // access().
5537 constexpr const char *FILENAME = " faccessat_basic3.test" ;
5638 auto TEST_FILE = libc_make_test_file_path (FILENAME);
5739
58- // Create file with full permissions
40+ // Check permissions on a file with full permissions
5941 int fd = LIBC_NAMESPACE::open (TEST_FILE, O_WRONLY | O_CREAT, S_IRWXU);
6042 ASSERT_ERRNO_SUCCESS ();
6143 ASSERT_GT (fd, 0 );
6244 ASSERT_THAT (LIBC_NAMESPACE::close (fd), Succeeds (0 ));
6345
64- ASSERT_THAT (LIBC_NAMESPACE::faccessat (AT_FDCWD, TEST_FILE, F_OK, 0 ), Succeeds (0 ));
65- ASSERT_THAT (LIBC_NAMESPACE::faccessat (AT_FDCWD, TEST_FILE, X_OK | W_OK | R_OK, 0 ),
46+ ASSERT_THAT (LIBC_NAMESPACE::faccessat (AT_FDCWD, TEST_FILE, F_OK, 0 ),
6647 Succeeds (0 ));
48+ ASSERT_THAT (
49+ LIBC_NAMESPACE::faccessat (AT_FDCWD, TEST_FILE, X_OK | W_OK | R_OK, 0 ),
50+ Succeeds (0 ));
6751 ASSERT_THAT (LIBC_NAMESPACE::unlink (TEST_FILE), Succeeds (0 ));
6852
69- // Create file with execute-only permission
53+ // Check permissions on a file with execute-only permission
7054 fd = LIBC_NAMESPACE::open (TEST_FILE, O_WRONLY | O_CREAT, S_IXUSR);
7155 ASSERT_ERRNO_SUCCESS ();
7256 ASSERT_GT (fd, 0 );
7357 ASSERT_THAT (LIBC_NAMESPACE::close (fd), Succeeds (0 ));
7458
75- ASSERT_THAT (LIBC_NAMESPACE::faccessat (AT_FDCWD, TEST_FILE, F_OK, 0 ), Succeeds (0 ));
76- ASSERT_THAT (LIBC_NAMESPACE::faccessat (AT_FDCWD, TEST_FILE, X_OK, 0 ), Succeeds (0 ));
77- ASSERT_THAT (LIBC_NAMESPACE::faccessat (AT_FDCWD, TEST_FILE, R_OK, 0 ), Fails (EACCES));
78- ASSERT_THAT (LIBC_NAMESPACE::faccessat (AT_FDCWD, TEST_FILE, W_OK, 0 ), Fails (EACCES));
59+ ASSERT_THAT (LIBC_NAMESPACE::faccessat (AT_FDCWD, TEST_FILE, F_OK, 0 ),
60+ Succeeds (0 ));
61+ ASSERT_THAT (LIBC_NAMESPACE::faccessat (AT_FDCWD, TEST_FILE, X_OK, 0 ),
62+ Succeeds (0 ));
63+ ASSERT_THAT (LIBC_NAMESPACE::faccessat (AT_FDCWD, TEST_FILE, R_OK, 0 ),
64+ Fails (EACCES));
65+ ASSERT_THAT (LIBC_NAMESPACE::faccessat (AT_FDCWD, TEST_FILE, W_OK, 0 ),
66+ Fails (EACCES));
7967 ASSERT_THAT (LIBC_NAMESPACE::unlink (TEST_FILE), Succeeds (0 ));
68+
69+ // Check permissions on a non existent file
70+ ASSERT_THAT (LIBC_NAMESPACE::faccessat (AT_FDCWD, TEST_FILE, F_OK, 0 ),
71+ Fails (ENOENT));
8072}
8173
8274TEST_F (LlvmLibcFaccessatTest, RelativePathWithDirFD) {
83- LIBC_NAMESPACE::cpp::string DIRNAME =" faccessat_dir3" ;
84- LIBC_NAMESPACE::cpp::string FILENAME = " relative_file3.txt" ;
75+ // Check permissions on a file releative to dir_fd
76+ const cpp::string DIRNAME = " faccessat_dir3" ;
77+ const cpp::string FILENAME = " relative_file3.txt" ;
78+
79+ auto TEST_DIR = libc_make_test_file_path (DIRNAME.data ());
80+ ASSERT_THAT (LIBC_NAMESPACE::mkdir (TEST_DIR, S_IRWXU), Succeeds (0 ));
8581
86- int dir_fd;
87- create_test_dir (DIRNAME.data (), dir_fd);
82+ int dir_fd = LIBC_NAMESPACE::open (TEST_DIR, O_RDONLY | O_DIRECTORY);
83+ ASSERT_ERRNO_SUCCESS ();
84+ ASSERT_GT (dir_fd, 0 );
8885
89- auto FULL_FILE_PATH = libc_make_test_file_path ((DIRNAME + " /" + FILENAME).data ());
86+ auto FULL_FILE_PATH =
87+ libc_make_test_file_path ((DIRNAME + " /" + FILENAME).data ());
9088 int fd = LIBC_NAMESPACE::open (FULL_FILE_PATH, O_WRONLY | O_CREAT, S_IRWXU);
9189 ASSERT_ERRNO_SUCCESS ();
9290 ASSERT_GT (fd, 0 );
9391 ASSERT_THAT (LIBC_NAMESPACE::close (fd), Succeeds (0 ));
9492
95- ASSERT_THAT (LIBC_NAMESPACE::faccessat (dir_fd, FILENAME.data (), R_OK | W_OK, 0 ), Succeeds (0 ));
93+ ASSERT_THAT (
94+ LIBC_NAMESPACE::faccessat (dir_fd, FILENAME.data (), R_OK | W_OK, 0 ),
95+ Succeeds (0 ));
9696
97- ASSERT_THAT (LIBC_NAMESPACE::unlinkat (dir_fd, FILENAME.data (), 0 ), Succeeds (0 ));
98- cleanup_test_dir (DIRNAME.data (), dir_fd);
97+ ASSERT_THAT (LIBC_NAMESPACE::unlinkat (dir_fd, FILENAME.data (), 0 ),
98+ Succeeds (0 ));
99+ ASSERT_THAT (LIBC_NAMESPACE::close (dir_fd), Succeeds (0 ));
100+ ASSERT_THAT (LIBC_NAMESPACE::rmdir (TEST_DIR), Succeeds (0 ));
99101}
100102
101103TEST_F (LlvmLibcFaccessatTest, SymlinkNoFollow) {
104+ // Check permissions on a symlink itself, not what it links to
102105 constexpr const char *TARGET = " faccessat_target2" ;
103106 constexpr const char *SYMLINK = " faccessat_link2" ;
104107 auto TEST_TARGET = libc_make_test_file_path (TARGET);
@@ -111,17 +114,20 @@ TEST_F(LlvmLibcFaccessatTest, SymlinkNoFollow) {
111114
112115 ASSERT_THAT (LIBC_NAMESPACE::symlink (TARGET, TEST_SYMLINK), Succeeds (0 ));
113116
114- ASSERT_THAT (LIBC_NAMESPACE::faccessat (AT_FDCWD, TEST_SYMLINK, R_OK, 0 ), Fails (EACCES));
115- ASSERT_THAT (LIBC_NAMESPACE::faccessat (AT_FDCWD, TEST_SYMLINK, F_OK, AT_SYMLINK_NOFOLLOW), Succeeds (0 ));
117+ ASSERT_THAT (LIBC_NAMESPACE::faccessat (AT_FDCWD, TEST_SYMLINK, R_OK, 0 ),
118+ Fails (EACCES));
119+ ASSERT_THAT (LIBC_NAMESPACE::faccessat (AT_FDCWD, TEST_SYMLINK, F_OK,
120+ AT_SYMLINK_NOFOLLOW),
121+ Succeeds (0 ));
116122
117123 ASSERT_THAT (LIBC_NAMESPACE::unlink (TEST_SYMLINK), Succeeds (0 ));
118124 ASSERT_THAT (LIBC_NAMESPACE::unlink (TEST_TARGET), Succeeds (0 ));
119125}
120126
121127TEST_F (LlvmLibcFaccessatTest, AtEaccess) {
122128 // With AT_EACCESS, faccessat checks permissions using the effective user ID,
123- // but the effective and real user ID will be the same here and changing that is not feasible in a test,
124- // so this is just a basic sanity check.
129+ // but the effective and real user ID will be the same here and changing that
130+ // is not feasible in a test, so this is just a basic sanity check.
125131 constexpr const char *FILENAME = " faccessat_eaccess.test" ;
126132 auto TEST_FILE = libc_make_test_file_path (FILENAME);
127133
@@ -130,7 +136,8 @@ TEST_F(LlvmLibcFaccessatTest, AtEaccess) {
130136 ASSERT_GT (fd, 0 );
131137 ASSERT_THAT (LIBC_NAMESPACE::close (fd), Succeeds (0 ));
132138
133- ASSERT_THAT (LIBC_NAMESPACE::faccessat (AT_FDCWD, TEST_FILE, X_OK | W_OK | R_OK, AT_EACCESS),
139+ ASSERT_THAT (LIBC_NAMESPACE::faccessat (AT_FDCWD, TEST_FILE, X_OK | W_OK | R_OK,
140+ AT_EACCESS),
134141 Succeeds (0 ));
135142
136143 ASSERT_THAT (LIBC_NAMESPACE::unlink (TEST_FILE), Succeeds (0 ));
@@ -144,15 +151,21 @@ TEST_F(LlvmLibcFaccessatTest, AtEmptyPath) {
144151 ASSERT_ERRNO_SUCCESS ();
145152 ASSERT_GT (fd, 0 );
146153
147- ASSERT_THAT ( LIBC_NAMESPACE::faccessat (fd, " " , F_OK, AT_EMPTY_PATH), Succeeds ( 0 ));
148- ASSERT_THAT (LIBC_NAMESPACE::faccessat (fd, " " , X_OK | W_OK | R_OK , AT_EMPTY_PATH),
154+ // Check permissions on the file referred to by fd
155+ ASSERT_THAT (LIBC_NAMESPACE::faccessat (fd, " " , F_OK , AT_EMPTY_PATH),
149156 Succeeds (0 ));
157+ ASSERT_THAT (
158+ LIBC_NAMESPACE::faccessat (fd, " " , X_OK | W_OK | R_OK, AT_EMPTY_PATH),
159+ Succeeds (0 ));
150160
151161 ASSERT_THAT (LIBC_NAMESPACE::close (fd), Succeeds (0 ));
152162 ASSERT_THAT (LIBC_NAMESPACE::unlink (TEST_FILE), Succeeds (0 ));
153163
154- ASSERT_THAT (LIBC_NAMESPACE::faccessat (AT_FDCWD, " " , F_OK, AT_EMPTY_PATH), Succeeds (0 ));
155- ASSERT_THAT (LIBC_NAMESPACE::faccessat (AT_FDCWD, " " , X_OK | W_OK | R_OK, AT_EMPTY_PATH),
164+ // Check permissions on the current working directory
165+ ASSERT_THAT (LIBC_NAMESPACE::faccessat (AT_FDCWD, " " , F_OK, AT_EMPTY_PATH),
166+ Succeeds (0 ));
167+ ASSERT_THAT (LIBC_NAMESPACE::faccessat (AT_FDCWD, " " , X_OK | W_OK | R_OK,
168+ AT_EMPTY_PATH),
156169 Succeeds (0 ));
157170}
158171
0 commit comments