[LTP] [PATCH] syscalls/setrlimit: add setrlimit04

Li Wang liwan@redhat.com
Mon Jul 17 07:01:56 CEST 2017


On Fri, Jul 14, 2017 at 7:12 PM, Jan Stancek <jstancek@redhat.com> wrote:
> Early patches for stack guard gap caused that gap size was contributing
> towards stack limit. This caused failures for new processes (E2BIG) when
> ulimit was set to anything lower than size of gap.
>
>   # ./setrlimit04
>   tst_test.c:898: INFO: Timeout per run is 0h 05m 00s
>   setrlimit04.c:53: BROK: execlp(/bin/true, /bin/true, ...) failed: E2BIG
>   setrlimit04.c:61: FAIL: child process exited with 2
>
> commit 1be7107fbe18 "mm: larger stack guard gap, between vmas" sets default
> gap size to 1M (for systems with 4k pages), so let's set stack limit to 512kB
> and confirm we can still run some trivial binary.
>
> Signed-off-by: Jan Stancek <jstancek@redhat.com>
> ---
>  runtest/syscalls                                  |  1 +
>  testcases/kernel/syscalls/.gitignore              |  1 +
>  testcases/kernel/syscalls/setrlimit/setrlimit04.c | 67 +++++++++++++++++++++++
>  3 files changed, 69 insertions(+)
>  create mode 100644 testcases/kernel/syscalls/setrlimit/setrlimit04.c
>
> diff --git a/runtest/syscalls b/runtest/syscalls
> index 91aba8504ef3..dddc7b0bee94 100644
> --- a/runtest/syscalls
> +++ b/runtest/syscalls
> @@ -1132,6 +1132,7 @@ setreuid07_16 setreuid07_16
>  setrlimit01 setrlimit01
>  setrlimit02 setrlimit02
>  setrlimit03 setrlimit03
> +setrlimit04 setrlimit04
>
>  set_robust_list01 set_robust_list01
>  set_thread_area01 set_thread_area01
> diff --git a/testcases/kernel/syscalls/.gitignore b/testcases/kernel/syscalls/.gitignore
> index 3d9bb756c82b..1735cdab0860 100644
> --- a/testcases/kernel/syscalls/.gitignore
> +++ b/testcases/kernel/syscalls/.gitignore
> @@ -922,6 +922,7 @@
>  /setrlimit/setrlimit01
>  /setrlimit/setrlimit02
>  /setrlimit/setrlimit03
> +/setrlimit/setrlimit04
>  /setsid/setsid01
>  /setsockopt/setsockopt01
>  /settimeofday/settimeofday01
> diff --git a/testcases/kernel/syscalls/setrlimit/setrlimit04.c b/testcases/kernel/syscalls/setrlimit/setrlimit04.c
> new file mode 100644
> index 000000000000..13d1b9f98700
> --- /dev/null
> +++ b/testcases/kernel/syscalls/setrlimit/setrlimit04.c
> @@ -0,0 +1,67 @@
> +/*
> + *   Copyright (C) 2017 Red Hat, Inc.  All rights reserved.
> + *
> + *   This program is free software;  you can redistribute it and/or modify
> + *   it under the terms of the GNU General Public License as published by
> + *   the Free Software Foundation; either version 2 of the License, or
> + *   (at your option) any later version.
> + *
> + *   This program is distributed in the hope that it will be useful,
> + *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
> + *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
> + *   the GNU General Public License for more details.
> + *
> + *   DESCRIPTION
> + *     Attempt to run a trivial binary with stack < 1MB.
> + *
> + *     Early patches for stack guard gap caused that gap size was
> + *     contributing towards stack limit. This caused failures
> + *     for new processes (E2BIG) when ulimit was set to anything
> + *     lower than size of gap. commit 1be7107fbe18 "mm: larger
> + *     stack guard gap, between vmas" sets default gap size to 1M
> + *     (for systems with 4k pages), so let's set stack limit to 512kB
> + *     and confirm we can still run some trivial binary.
> + */
> +
> +#define _GNU_SOURCE
> +#include <sys/resource.h>
> +#include <sys/time.h>
> +#include <sys/wait.h>
> +
> +#include "tst_test.h"
> +
> +#define STACK_LIMIT (512 * 1024)
> +
> +static void test_setrlimit(void)
> +{
> +       int status;
> +       struct rlimit rlim;
> +       pid_t child;
> +
> +       rlim.rlim_cur = STACK_LIMIT;
> +       rlim.rlim_max = STACK_LIMIT;
> +
> +       SAFE_SETRLIMIT(RLIMIT_STACK, &rlim);
> +
> +       child = SAFE_FORK();
> +       if (child == 0)
> +               SAFE_EXECLP("/bin/true", "/bin/true", NULL);
> +       SAFE_WAITPID(child, &status, 0);
> +
> +       if (WIFEXITED(status)) {
> +               if ((WEXITSTATUS(status) == 0))
> +                       tst_res(TPASS, "child process completed OK");
> +               else
> +                       tst_res(TFAIL, "child process exited with %d",
> +                               WEXITSTATUS(status));
> +       } else if (WIFSIGNALED(status)) {
> +               tst_res(TFAIL, "child exited with signal %s",
> +                       tst_strsig(WTERMSIG(status)));
> +       }
> +}
> +
> +static struct tst_test test = {
> +       .test_all     = test_setrlimit,
> +       .forks_child  = 1,
> +       .needs_root = 1,

seems we need to filter out the suitable kernel:

.min_kver = "4.12.0",


-- 
Regards,
Li Wang
Email: liwang@redhat.com


More information about the ltp mailing list