1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Copyright (c) International Business Machines Corp., 2001
4 * Ported to LTP: Wayne Boyer
5 * Copyright (c) 2017 Cyril Hrubis <chrubis@suse.cz>
6 */
7/*
8 * Testcase to test the different errnos set by setrlimit(2) system call.
9 */
10#include <pwd.h>
11#include <errno.h>
12#include "tst_test.h"
13
14static char nobody_uid[] = "nobody";
15static struct rlimit rlim;
16
17static struct tcase {
18	int resource;
19	struct rlimit *rlim;
20	int exp_errno;
21} tcases[] = {
22	{-1, &rlim, EINVAL},
23	{RLIMIT_NOFILE, &rlim, EPERM}
24};
25
26static void verify_setrlimit(unsigned int n)
27{
28	struct tcase *tc = &tcases[n];
29
30	TEST(setrlimit(tc->resource, tc->rlim));
31
32	if (TST_RET != -1) {
33		tst_res(TFAIL, "call succeeded unexpectedly");
34		return;
35	}
36
37	if (TST_ERR != tc->exp_errno) {
38		tst_res(TFAIL | TTERRNO,
39			"setrlimit() should fail with %s got",
40			tst_strerrno(tc->exp_errno));
41		return;
42	}
43
44	tst_res(TPASS | TTERRNO, "setrlimit() failed as expected");
45}
46
47static void setup(void)
48{
49	struct passwd *ltpuser = SAFE_GETPWNAM(nobody_uid);
50
51	SAFE_SETUID(ltpuser->pw_uid);
52
53	SAFE_GETRLIMIT(RLIMIT_NOFILE, &rlim);
54	rlim.rlim_max++;
55}
56
57static struct tst_test test = {
58	.setup = setup,
59	.test = verify_setrlimit,
60	.tcnt = ARRAY_SIZE(tcases),
61	.needs_root = 1,
62};
63