Kernel imposes a limit of 32 nested levels of pid namespaces. Signed-off-by: Yuan Sun <sunyu...@huawei.com> --- runtest/containers | 1 + testcases/kernel/containers/pidns/.gitignore | 1 + testcases/kernel/containers/pidns/pidns32.c | 96 ++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 testcases/kernel/containers/pidns/pidns32.c
diff --git a/runtest/containers b/runtest/containers index 9dc44bc..ac37ab2 100644 --- a/runtest/containers +++ b/runtest/containers @@ -13,6 +13,7 @@ pidns17 pidns17 pidns20 pidns20 pidns30 pidns30 pidns31 pidns31 +pidns32 pidns32 mqns_01 mqns_01 mqns_01_clone mqns_01 -clone diff --git a/testcases/kernel/containers/pidns/.gitignore b/testcases/kernel/containers/pidns/.gitignore index e56c1f9..488b045 100644 --- a/testcases/kernel/containers/pidns/.gitignore +++ b/testcases/kernel/containers/pidns/.gitignore @@ -12,3 +12,4 @@ /pidns20 /pidns30 /pidns31 +/pidns32 diff --git a/testcases/kernel/containers/pidns/pidns32.c b/testcases/kernel/containers/pidns/pidns32.c new file mode 100644 index 0000000..d0d3e1e --- /dev/null +++ b/testcases/kernel/containers/pidns/pidns32.c @@ -0,0 +1,96 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd., 2015 + * 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. + */ + +/* + * Verify that: + * The kernel imposes a limit of 32 nested levels of pid namespaces. + */ + +#define _GNU_SOURCE +#include <sys/wait.h> +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <errno.h> +#include "test.h" +#include "pidns_helper.h" + +#define MAXNEST 32 + +char *TCID = "pidns32"; +int TST_TOTAL = 1; + +static void setup(void) +{ + if (tst_kvercmp(3, 7, 0) < 0) + tst_brkm(TCONF, NULL, "nest depth limitation not supported"); + tst_require_root(); + check_newpid(); + tst_tmpdir(); +} + +static void cleanup(void) +{ + tst_rmdir(); +} + +static int child_fn1(void *arg) +{ + pid_t cpid1; + long level = (long)arg; + + cpid1 = ltp_clone_quick(CLONE_NEWPID | SIGCHLD, + (void *)child_fn1, (void *)(level + 1)); + if (cpid1 < 0) { + if (level == MAXNEST) + return 0; + return 1; + } + if (waitpid(cpid1, NULL, 0) == -1) + return 1; + if (level > MAXNEST) { + printf("MAX_PIS_NS_LEVEL doestn't take effect\n"); + return 1; + } + return 0; +} + +static void test_max_nest(void) +{ + pid_t cpid1; + + cpid1 = ltp_clone_quick(CLONE_NEWPID | SIGCHLD, + (void *)child_fn1, (void *)1); + if (cpid1 < 0) + tst_brkm(TBROK | TERRNO, cleanup, "clone failed"); + + tst_record_childstatus(cleanup, cpid1); +} + +int main(int argc, char *argv[]) +{ + int lc; + + setup(); + tst_parse_opts(argc, argv, NULL, NULL); + + for (lc = 0; TEST_LOOPING(lc); lc++) { + tst_count = 0; + test_max_nest(); + } + + cleanup(); + tst_exit(); +} -- 1.9.1 ------------------------------------------------------------------------------ _______________________________________________ Ltp-list mailing list Ltp-list@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ltp-list