1 // SPDX-License-Identifier: GPL-2.0
8 #include <linux/types.h>
16 #include <sys/mount.h>
17 #include <sys/prctl.h>
22 #include "../kselftest.h"
24 static int safe_int(const char *numstr, int *converted)
30 sli = strtol(numstr, &err, 0);
31 if (errno == ERANGE && (sli == LONG_MAX || sli == LONG_MIN))
34 if (errno != 0 && sli == 0)
37 if (err == numstr || *err != '\0')
40 if (sli > INT_MAX || sli < INT_MIN)
43 *converted = (int)sli;
47 static int char_left_gc(const char *buffer, size_t len)
51 for (i = 0; i < len; i++) {
52 if (buffer[i] == ' ' ||
62 static int char_right_gc(const char *buffer, size_t len)
66 for (i = len - 1; i >= 0; i--) {
67 if (buffer[i] == ' ' ||
79 static char *trim_whitespace_in_place(char *buffer)
81 buffer += char_left_gc(buffer, strlen(buffer));
82 buffer[char_right_gc(buffer, strlen(buffer))] = '\0';
86 static pid_t get_pid_from_fdinfo_file(int pidfd, const char *key, size_t keylen)
95 snprintf(path, sizeof(path), "/proc/self/fdinfo/%d", pidfd);
97 f = fopen(path, "re");
101 while (getline(&line, &n, f) != -1) {
104 if (strncmp(line, key, keylen))
107 numstr = trim_whitespace_in_place(line + 4);
108 ret = safe_int(numstr, &result);
121 int main(int argc, char **argv)
123 int pidfd = -1, ret = 1;
128 pidfd = sys_pidfd_open(-1, 0);
131 "%s - succeeded to open pidfd for invalid pid -1\n",
135 ksft_test_result_pass("do not allow invalid pid test: passed\n");
137 pidfd = sys_pidfd_open(getpid(), 1);
140 "%s - succeeded to open pidfd with invalid flag value specified\n",
144 ksft_test_result_pass("do not allow invalid flag test: passed\n");
146 pidfd = sys_pidfd_open(getpid(), 0);
148 ksft_print_msg("%s - failed to open pidfd\n", strerror(errno));
151 ksft_test_result_pass("open a new pidfd test: passed\n");
153 pid = get_pid_from_fdinfo_file(pidfd, "Pid:", sizeof("Pid:") - 1);
154 ksft_print_msg("pidfd %d refers to process with pid %d\n", pidfd, pid);
162 return !ret ? ksft_exit_pass() : ksft_exit_fail();