at master 69 lines 1.4 kB view raw
1// SPDX-License-Identifier: GPL-2.0 2 3#define _GNU_SOURCE 4#include <errno.h> 5#include <fcntl.h> 6#include <limits.h> 7#include <linux/types.h> 8#include <poll.h> 9#include <pthread.h> 10#include <sched.h> 11#include <signal.h> 12#include <stdio.h> 13#include <stdlib.h> 14#include <string.h> 15#include <syscall.h> 16#include <sys/prctl.h> 17#include <sys/wait.h> 18#include <unistd.h> 19#include <sys/socket.h> 20#include <linux/kcmp.h> 21#include <sys/stat.h> 22#include <sys/xattr.h> 23 24#include "pidfd.h" 25#include "kselftest_harness.h" 26 27FIXTURE(pidfs_setattr) 28{ 29 pid_t child_pid; 30 int child_pidfd; 31}; 32 33FIXTURE_SETUP(pidfs_setattr) 34{ 35 self->child_pid = create_child(&self->child_pidfd, CLONE_NEWUSER | CLONE_NEWPID); 36 EXPECT_GE(self->child_pid, 0); 37 38 if (self->child_pid == 0) 39 _exit(EXIT_SUCCESS); 40} 41 42FIXTURE_TEARDOWN(pidfs_setattr) 43{ 44 sys_waitid(P_PID, self->child_pid, NULL, WEXITED); 45 EXPECT_EQ(close(self->child_pidfd), 0); 46} 47 48TEST_F(pidfs_setattr, no_chown) 49{ 50 ASSERT_LT(fchown(self->child_pidfd, 1234, 5678), 0); 51 ASSERT_EQ(errno, EOPNOTSUPP); 52} 53 54TEST_F(pidfs_setattr, no_chmod) 55{ 56 ASSERT_LT(fchmod(self->child_pidfd, 0777), 0); 57 ASSERT_EQ(errno, EOPNOTSUPP); 58} 59 60TEST_F(pidfs_setattr, no_exec) 61{ 62 char *const argv[] = { NULL }; 63 char *const envp[] = { NULL }; 64 65 ASSERT_LT(execveat(self->child_pidfd, "", argv, envp, AT_EMPTY_PATH), 0); 66 ASSERT_EQ(errno, EACCES); 67} 68 69TEST_HARNESS_MAIN