| #define _GNU_SOURCE | |
| #include <assert.h> | |
| #include <errno.h> | |
| #include <fcntl.h> | |
| #include <linux/types.h> | |
| #include <sched.h> | |
| #include <signal.h> | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #include <syscall.h> | |
| #include <sys/wait.h> | |
| #include "kselftest_harness.h" | |
| #include "../pidfd/pidfd.h" | |
| /* | |
| * Regression test for: | |
| * 35f71bc0a09a ("fork: report pid reservation failure properly") | |
| * b26ebfe12f34 ("pid: Fix error return value in some cases") | |
| */ | |
| TEST(regression_enomem) | |
| { | |
| pid_t pid; | |
| if (geteuid()) | |
| EXPECT_EQ(0, unshare(CLONE_NEWUSER)); | |
| EXPECT_EQ(0, unshare(CLONE_NEWPID)); | |
| pid = fork(); | |
| ASSERT_GE(pid, 0); | |
| if (pid == 0) | |
| exit(EXIT_SUCCESS); | |
| EXPECT_EQ(0, wait_for_pid(pid)); | |
| pid = fork(); | |
| ASSERT_LT(pid, 0); | |
| ASSERT_EQ(errno, ENOMEM); | |
| } | |
| TEST_HARNESS_MAIN |