1 /*
2 * Copyright (C) 2017 Red Hat, Inc. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
12 * the GNU General Public License for more details.
13 *
14 * DESCRIPTION
15 * Attempt to run a trivial binary with stack < 1MB.
16 *
17 * Early patches for stack guard gap caused that gap size was
18 * contributing to stack limit. This caused failures
19 * for new processes (E2BIG) when ulimit was set to anything
20 * lower than size of gap. commit 1be7107fbe18 "mm: larger
21 * stack guard gap, between vmas" sets default gap size to 1M
22 * (for systems with 4k pages), so let's set stack limit to 512kB
23 * and confirm we can still run some trivial binary.
24 */
25
26 #define _GNU_SOURCE
27 #include <sys/resource.h>
28 #include <sys/time.h>
29 #include <sys/wait.h>
30
31 #include "tst_test.h"
32
33 #define STACK_LIMIT (512 * 1024)
34
test_setrlimit(void)35 static void test_setrlimit(void)
36 {
37 int status;
38 struct rlimit rlim;
39 pid_t child;
40
41 rlim.rlim_cur = STACK_LIMIT;
42 rlim.rlim_max = STACK_LIMIT;
43
44 SAFE_SETRLIMIT(RLIMIT_STACK, &rlim);
45
46 child = SAFE_FORK();
47 if (child == 0)
48 SAFE_EXECLP("/bin/true", "/bin/true", NULL);
49 SAFE_WAITPID(child, &status, 0);
50
51 if (WIFEXITED(status) && WEXITSTATUS(status) == 0) {
52 tst_res(TPASS, "child process completed OK");
53 return;
54 }
55
56 tst_res(TFAIL, "child %s", tst_strstatus(status));
57 }
58
59 static struct tst_test test = {
60 .test_all = test_setrlimit,
61 .forks_child = 1,
62 .needs_root = 1,
63 };
64