xref: /freebsd/contrib/capsicum-test/rename.cc (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1 #include <fcntl.h>
2 #include <sys/stat.h>
3 
4 #include "./capsicum-test.h"
5 
6 // There was a Capsicum-related regression in FreeBSD renameat,
7 // which affects certain cases independent of Capsicum or capability mode
8 //
9 // added to test the renameat syscall for the case that
10 //    - the "to" file already exists
11 //    - the "to" file is specified by an absolute path
12 //    - the "to" file descriptor is used
13 //          (this descriptor should be ignored if absolute path is provided)
14 //
15 // details at: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=222258
16 
17 
18 const char * create_tmp_src(const char* filename) {
19     const char *src_path = TmpFile(filename);
20     int src_fd = open(src_path, O_CREAT|O_RDWR, 0644);
21     close(src_fd);
22     return src_path;
23 }
24 
25 TEST(Rename, AbsDesignationSame) {
26     const char *src_path = create_tmp_src("rename_test");
27     EXPECT_OK(rename(src_path, src_path));
28     unlink(src_path);
29 }
30 
31 TEST(RenameAt, AbsDesignationSame) {
32     const char *src_path = create_tmp_src("renameat_test");
33     const char *dir_path = TmpFile("renameat_test_dir");
34 
35     EXPECT_OK(mkdir(dir_path, 0755));
36     // random temporary directory descriptor
37     int dfd = open(dir_path, O_DIRECTORY);
38 
39     // Various rename from/to the same absolute path; in each case the source
40     // and dest directory FDs should be irrelevant.
41     EXPECT_OK(renameat(AT_FDCWD, src_path, AT_FDCWD, src_path));
42     EXPECT_OK(renameat(AT_FDCWD, src_path, dfd, src_path));
43     EXPECT_OK(renameat(dfd, src_path, AT_FDCWD, src_path));
44     EXPECT_OK(renameat(dfd, src_path, dfd, src_path));
45 
46     close(dfd);
47     rmdir(dir_path);
48     unlink(src_path);
49 }
50