xref: /linux/tools/testing/selftests/filesystems/anon_inode_test.c (revision 69050f8d6d075dc01af7a5f2f550a8067510366f)
1 // SPDX-License-Identifier: GPL-2.0
2 #define _GNU_SOURCE
3 #define __SANE_USERSPACE_TYPES__
4 
5 #include <fcntl.h>
6 #include <stdio.h>
7 #include <sys/stat.h>
8 
9 #include "kselftest_harness.h"
10 #include "wrappers.h"
11 
12 TEST(anon_inode_no_chown)
13 {
14 	int fd_context;
15 
16 	fd_context = sys_fsopen("tmpfs", 0);
17 	ASSERT_GE(fd_context, 0);
18 
19 	ASSERT_LT(fchown(fd_context, 1234, 5678), 0);
20 	ASSERT_EQ(errno, EOPNOTSUPP);
21 
22 	EXPECT_EQ(close(fd_context), 0);
23 }
24 
25 TEST(anon_inode_no_chmod)
26 {
27 	int fd_context;
28 
29 	fd_context = sys_fsopen("tmpfs", 0);
30 	ASSERT_GE(fd_context, 0);
31 
32 	ASSERT_LT(fchmod(fd_context, 0777), 0);
33 	ASSERT_EQ(errno, EOPNOTSUPP);
34 
35 	EXPECT_EQ(close(fd_context), 0);
36 }
37 
38 TEST(anon_inode_no_exec)
39 {
40 	int fd_context;
41 
42 	fd_context = sys_fsopen("tmpfs", 0);
43 	ASSERT_GE(fd_context, 0);
44 
45 	char *const empty_argv[] = {NULL};
46 	char *const empty_envp[] = {NULL};
47 
48 	ASSERT_LT(execveat(fd_context, "", empty_argv, empty_envp, AT_EMPTY_PATH), 0);
49 	ASSERT_EQ(errno, EACCES);
50 
51 	EXPECT_EQ(close(fd_context), 0);
52 }
53 
54 TEST(anon_inode_no_open)
55 {
56 	int fd_context;
57 
58 	fd_context = sys_fsopen("tmpfs", 0);
59 	ASSERT_GE(fd_context, 0);
60 
61 	ASSERT_GE(dup2(fd_context, 500), 0);
62 	ASSERT_EQ(close(fd_context), 0);
63 	fd_context = 500;
64 
65 	ASSERT_LT(open("/proc/self/fd/500", 0), 0);
66 	ASSERT_EQ(errno, ENXIO);
67 
68 	EXPECT_EQ(close(fd_context), 0);
69 }
70 
71 TEST_HARNESS_MAIN
72 
73