| // SPDX-License-Identifier: GPL-2.0 | |
| #define _GNU_SOURCE | |
| #define __SANE_USERSPACE_TYPES__ | |
| #include <fcntl.h> | |
| #include <stdio.h> | |
| #include <sys/stat.h> | |
| #include "kselftest_harness.h" | |
| #include "wrappers.h" | |
| TEST(anon_inode_no_chown) | |
| { | |
| int fd_context; | |
| fd_context = sys_fsopen("tmpfs", 0); | |
| ASSERT_GE(fd_context, 0); | |
| ASSERT_LT(fchown(fd_context, 1234, 5678), 0); | |
| ASSERT_EQ(errno, EOPNOTSUPP); | |
| EXPECT_EQ(close(fd_context), 0); | |
| } | |
| TEST(anon_inode_no_chmod) | |
| { | |
| int fd_context; | |
| fd_context = sys_fsopen("tmpfs", 0); | |
| ASSERT_GE(fd_context, 0); | |
| ASSERT_LT(fchmod(fd_context, 0777), 0); | |
| ASSERT_EQ(errno, EOPNOTSUPP); | |
| EXPECT_EQ(close(fd_context), 0); | |
| } | |
| TEST(anon_inode_no_exec) | |
| { | |
| int fd_context; | |
| fd_context = sys_fsopen("tmpfs", 0); | |
| ASSERT_GE(fd_context, 0); | |
| char *const empty_argv[] = {NULL}; | |
| char *const empty_envp[] = {NULL}; | |
| ASSERT_LT(execveat(fd_context, "", empty_argv, empty_envp, AT_EMPTY_PATH), 0); | |
| ASSERT_EQ(errno, EACCES); | |
| EXPECT_EQ(close(fd_context), 0); | |
| } | |
| TEST(anon_inode_no_open) | |
| { | |
| int fd_context; | |
| fd_context = sys_fsopen("tmpfs", 0); | |
| ASSERT_GE(fd_context, 0); | |
| ASSERT_GE(dup2(fd_context, 500), 0); | |
| ASSERT_EQ(close(fd_context), 0); | |
| fd_context = 500; | |
| ASSERT_LT(open("/proc/self/fd/500", 0), 0); | |
| ASSERT_EQ(errno, ENXIO); | |
| EXPECT_EQ(close(fd_context), 0); | |
| } | |
| TEST_HARNESS_MAIN | |