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