diff options
author | Andrea Cervesato <andrea.cervesato@suse.de> | 2022-03-25 13:54:43 +0100 |
---|---|---|
committer | Cyril Hrubis <chrubis@suse.cz> | 2022-06-03 11:32:56 +0200 |
commit | b043751a6984c41db61067eebb0fee6ebf303960 (patch) | |
tree | a91a9fa7be24456bf4822bf3a1e0d89931684b95 | |
parent | e1bc5bbf1179533b4b54bd7794e1632890d6d999 (diff) | |
download | ltp-b043751a6984c41db61067eebb0fee6ebf303960.tar.gz |
Rewrite shm_comm.c using new LTP API
Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.de>
Reviewed-by: Cyril Hrubis <chrubis@suse.cz>
-rw-r--r-- | testcases/kernel/containers/sysvipc/shm_comm.c | 167 |
1 files changed, 50 insertions, 117 deletions
diff --git a/testcases/kernel/containers/sysvipc/shm_comm.c b/testcases/kernel/containers/sysvipc/shm_comm.c index 4b3bbfaa8..12ad49110 100644 --- a/testcases/kernel/containers/sysvipc/shm_comm.c +++ b/testcases/kernel/containers/sysvipc/shm_comm.c @@ -1,20 +1,17 @@ -/* Copyright (c) 2014 Red Hat, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of version 2 the GNU General Public License as - * published by the Free Software Foundation. +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2014 Red Hat, Inc. + * Copyright (C) 2022 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com> + */ + +/*\ + * [Description] * - * 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. + * Test if SysV IPC shared memory is properly working between two different + * namespaces. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - *********************************************************************** - * File: shm_comm.c + * [Algorithm] * - * Description: * 1. Clones two child processes with CLONE_NEWIPC flag, each child * allocates System V shared memory segment (shm) with the _identical_ * key and attaches that segment into its address space. @@ -27,141 +24,77 @@ */ #define _GNU_SOURCE -#include <sys/ipc.h> -#include <sys/shm.h> -#include <sys/types.h> -#include <sys/wait.h> -#include <stdio.h> -#include <errno.h> -#include "ipcns_helper.h" -#include "test.h" -#include "safe_macros.h" +#include <sys/wait.h> +#include <sys/msg.h> +#include <sys/types.h> +#include "tst_safe_sysv_ipc.h" +#include "tst_test.h" +#include "common.h" #define TESTKEY 124426L #define SHMSIZE 50 -char *TCID = "shm_comm"; -int TST_TOTAL = 1; - -static void cleanup(void) -{ - tst_rmdir(); -} - -static void setup(void) -{ - tst_require_root(); - check_newipc(); - tst_tmpdir(); - TST_CHECKPOINT_INIT(tst_rmdir); -} -int chld1_shm(void *arg) +static int chld1_shm(LTP_ATTRIBUTE_UNUSED void *arg) { - int id, rval = 0; + int id; char *shmem; - id = shmget(TESTKEY, SHMSIZE, IPC_CREAT); - if (id == -1) { - perror("shmget"); - return 2; - } - - if ((shmem = shmat(id, NULL, 0)) == (char *) -1) { - perror("shmat"); - shmctl(id, IPC_RMID, NULL); - return 2; - } + id = SAFE_SHMGET(TESTKEY, SHMSIZE, IPC_CREAT); + shmem = SAFE_SHMAT(id, NULL, 0); *shmem = 'A'; - TST_SAFE_CHECKPOINT_WAKE_AND_WAIT(NULL, 0); + TST_CHECKPOINT_WAKE_AND_WAIT(0); - /* if child1 shared segment has changed (by child2) report fail */ if (*shmem != 'A') - rval = 1; + tst_res(TFAIL, "shared memory leak between namespaces"); + else + tst_res(TPASS, "shared memory didn't leak between namespaces"); + + TST_CHECKPOINT_WAKE(0); - /* tell child2 to continue */ - TST_SAFE_CHECKPOINT_WAKE(NULL, 0); + SAFE_SHMDT(shmem); + SAFE_SHMCTL(id, IPC_RMID, NULL); - shmdt(shmem); - shmctl(id, IPC_RMID, NULL); - return rval; + return 0; } -int chld2_shm(void *arg) +static int chld2_shm(LTP_ATTRIBUTE_UNUSED void *arg) { int id; char *shmem; - id = shmget(TESTKEY, SHMSIZE, IPC_CREAT); - if (id == -1) { - perror("shmget"); - return 2; - } + id = SAFE_SHMGET(TESTKEY, SHMSIZE, IPC_CREAT); - if ((shmem = shmat(id, NULL, 0)) == (char *) -1) { - perror("shmat"); - shmctl(id, IPC_RMID, NULL); - return 2; - } + shmem = SAFE_SHMAT(id, NULL, 0); - /* wait for child1 to write to his segment */ - TST_SAFE_CHECKPOINT_WAIT(NULL, 0); + TST_CHECKPOINT_WAIT(0); *shmem = 'B'; - TST_SAFE_CHECKPOINT_WAKE_AND_WAIT(NULL, 0); + TST_CHECKPOINT_WAKE_AND_WAIT(0); + + SAFE_SHMDT(shmem); + SAFE_SHMCTL(id, IPC_RMID, NULL); - shmdt(shmem); - shmctl(id, IPC_RMID, NULL); return 0; } -static void test(void) +static void run(void) { - int status, ret = 0; - - ret = do_clone_unshare_test(T_CLONE, CLONE_NEWIPC, chld1_shm, NULL); - if (ret == -1) - tst_brkm(TBROK | TERRNO, cleanup, "clone failed"); - - ret = do_clone_unshare_test(T_CLONE, CLONE_NEWIPC, chld2_shm, NULL); - if (ret == -1) - tst_brkm(TBROK | TERRNO, cleanup, "clone failed"); - - - while (wait(&status) > 0) { - if (WIFEXITED(status) && WEXITSTATUS(status) == 1) - ret = 1; - if (WIFEXITED(status) && WEXITSTATUS(status) == 2) - tst_brkm(TBROK | TERRNO, cleanup, "error in child"); - if (WIFSIGNALED(status)) { - tst_resm(TFAIL, "child was killed with signal %s", - tst_strsig(WTERMSIG(status))); - return; - } - } - - if (ret) - tst_resm(TFAIL, "SysV shm: communication with identical keys" - " between namespaces"); - else - tst_resm(TPASS, "SysV shm: communication with identical keys" - " between namespaces"); + clone_unshare_test(T_CLONE, CLONE_NEWIPC, chld1_shm, NULL); + clone_unshare_test(T_CLONE, CLONE_NEWIPC, chld2_shm, NULL); } -int main(int argc, char *argv[]) +static void setup(void) { - int lc; - - tst_parse_opts(argc, argv, NULL, NULL); - - setup(); - - for (lc = 0; TEST_LOOPING(lc); lc++) - test(); - - cleanup(); - tst_exit(); + check_newipc(); } + +static struct tst_test test = { + .test_all = run, + .setup = setup, + .needs_root = 1, + .needs_checkpoints = 1, +}; |