| #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 |