162306a36Sopenharmony_ci#define _GNU_SOURCE
262306a36Sopenharmony_ci#include <assert.h>
362306a36Sopenharmony_ci#include <errno.h>
462306a36Sopenharmony_ci#include <fcntl.h>
562306a36Sopenharmony_ci#include <linux/types.h>
662306a36Sopenharmony_ci#include <sched.h>
762306a36Sopenharmony_ci#include <signal.h>
862306a36Sopenharmony_ci#include <stdio.h>
962306a36Sopenharmony_ci#include <stdlib.h>
1062306a36Sopenharmony_ci#include <string.h>
1162306a36Sopenharmony_ci#include <syscall.h>
1262306a36Sopenharmony_ci#include <sys/wait.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include "../kselftest_harness.h"
1562306a36Sopenharmony_ci#include "../pidfd/pidfd.h"
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci/*
1862306a36Sopenharmony_ci * Regression test for:
1962306a36Sopenharmony_ci * 35f71bc0a09a ("fork: report pid reservation failure properly")
2062306a36Sopenharmony_ci * b26ebfe12f34 ("pid: Fix error return value in some cases")
2162306a36Sopenharmony_ci */
2262306a36Sopenharmony_ciTEST(regression_enomem)
2362306a36Sopenharmony_ci{
2462306a36Sopenharmony_ci	pid_t pid;
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	if (geteuid())
2762306a36Sopenharmony_ci		EXPECT_EQ(0, unshare(CLONE_NEWUSER));
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	EXPECT_EQ(0, unshare(CLONE_NEWPID));
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	pid = fork();
3262306a36Sopenharmony_ci	ASSERT_GE(pid, 0);
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	if (pid == 0)
3562306a36Sopenharmony_ci		exit(EXIT_SUCCESS);
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	EXPECT_EQ(0, wait_for_pid(pid));
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	pid = fork();
4062306a36Sopenharmony_ci	ASSERT_LT(pid, 0);
4162306a36Sopenharmony_ci	ASSERT_EQ(errno, ENOMEM);
4262306a36Sopenharmony_ci}
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ciTEST_HARNESS_MAIN
45