1 | #define _GNU_SOURCE |
---|---|
2 | #include <assert.h> |
3 | #include <errno.h> |
4 | #include <fcntl.h> |
5 | #include <linux/types.h> |
6 | #include <sched.h> |
7 | #include <signal.h> |
8 | #include <stdio.h> |
9 | #include <stdlib.h> |
10 | #include <string.h> |
11 | #include <syscall.h> |
12 | #include <sys/wait.h> |
13 | |
14 | #include "../kselftest_harness.h" |
15 | #include "../pidfd/pidfd.h" |
16 | |
17 | /* |
18 | * Regression test for: |
19 | * 35f71bc0a09a ("fork: report pid reservation failure properly") |
20 | * b26ebfe12f34 ("pid: Fix error return value in some cases") |
21 | */ |
22 | TEST(regression_enomem) |
23 | { |
24 | pid_t pid; |
25 | |
26 | if (geteuid()) |
27 | EXPECT_EQ(0, unshare(CLONE_NEWUSER)); |
28 | |
29 | EXPECT_EQ(0, unshare(CLONE_NEWPID)); |
30 | |
31 | pid = fork(); |
32 | ASSERT_GE(pid, 0); |
33 | |
34 | if (pid == 0) |
35 | exit(EXIT_SUCCESS); |
36 | |
37 | EXPECT_EQ(0, wait_for_pid(pid)); |
38 | |
39 | pid = fork(); |
40 | ASSERT_LT(pid, 0); |
41 | ASSERT_EQ(errno, ENOMEM); |
42 | } |
43 | |
44 | TEST_HARNESS_MAIN |
45 |