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 */
22TEST(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
44TEST_HARNESS_MAIN
45