From: Andrea Cervesato via ltp <ltp@lists.linux.it>
To: Petr Vorel <pvorel@suse.cz>, Andrea Cervesato <andrea.cervesato@suse.de>
Cc: ltp@lists.linux.it
Subject: Re: [LTP] [PATCH v6 1/6] Refactor mqns_01 using new LTP API
Date: Wed, 10 May 2023 11:46:23 +0200 [thread overview]
Message-ID: <673bbf70-a00d-2a19-ce4b-b28b7633844a@suse.com> (raw)
In-Reply-To: <20230323103207.GG405493@pevik>
Hi!
On 3/23/23 11:32, Petr Vorel wrote:
> Hi Andrea,
>
>> diff --git a/runtest/containers b/runtest/containers
>> index 23f394579..5e1b53bfa 100644
>> --- a/runtest/containers
>> +++ b/runtest/containers
>> @@ -16,7 +16,8 @@ pidns31 pidns31
>> pidns32 pidns32
>> mqns_01 mqns_01
>> -mqns_01_clone mqns_01 -clone
>> +mqns_01_clone mqns_01 -m clone
> I'd be for renaming these testcases to rename the underscore (e.g. from
> mqns_01.c to mqns01.c). But this can be done any time later.
There are so many tests without convention. We should create it before
changing this test specifically.
>
>> +mqns_01_unshare mqns_01 -m unshare
>> mqns_02 mqns_02
>> mqns_02_clone mqns_02 -clone
>> mqns_03 mqns_03
>> diff --git a/testcases/kernel/containers/mqns/mqns_01.c b/testcases/kernel/containers/mqns/mqns_01.c
>> index 1d109e020..61e586c14 100644
>> --- a/testcases/kernel/containers/mqns/mqns_01.c
>> +++ b/testcases/kernel/containers/mqns/mqns_01.c
>> @@ -1,148 +1,82 @@
>> +// SPDX-License-Identifier: GPL-2.0
> It should be GPL-2.0-or-later
>
> I'm going to fix it before merge.
>
>> /*
>> -* Copyright (c) International Business Machines Corp., 2009
>> -* Copyright (c) Nadia Derbey, 2009
>> -* 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.
>> -*
>> -* Check mqns isolation: father mqns cannot be accessed from newinstance
>> -*
>> -* Mount mqueue fs
>> -* Create a posix mq -->mq1
>> -* unshare
>> -* In unshared process:
>> -* Mount newinstance mqueuefs
>> -* Check that mq1 is not readable from new ns
>> + * Copyright (c) International Business Machines Corp., 2009
>> + * Copyright (c) Nadia Derbey, 2009 <Nadia.Derbey@bull.net>
>> + * Copyright (C) 2023 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com>
>> + */
>> -***************************************************************************/
>> +/*\
>> + * [Description]
>> + *
>> + * Create a mqueue inside the parent and check if it can be accessed from
> maybe:
> Create a mqueue inside the parent and verify it cannot be accessed from
> the child namespace.
>
>> + * the child namespace.
>> + */
>> -#ifndef _GNU_SOURCE
>> -#define _GNU_SOURCE
>> -#endif
>> -#include <sys/wait.h>
>> -#include <errno.h>
>> -#include <stdio.h>
>> -#include <stdlib.h>
>> -#include <string.h>
>> -#include <unistd.h>
>> -#include "mqns.h"
>> -#include "mqns_helper.h"
>> +#include "tst_test.h"
>> +#include "lapi/sched.h"
>> +#include "tst_safe_posix_ipc.h"
>> -char *TCID = "posixmq_namespace_01";
>> -int TST_TOTAL = 1;
>> +#define MQNAME "/MQ1"
>> -int p1[2];
>> -int p2[2];
>> +static mqd_t mqd;
>> +static char *str_op;
>> -int check_mqueue(void *vtest)
>> +static void run(void)
>> {
>> - char buf[30];
>> - mqd_t mqd;
>> + const struct tst_clone_args clone_args = { CLONE_NEWIPC, SIGCHLD };
>> - (void) vtest;
>> + tst_res(TINFO, "Checking namespaces isolation from parent to child");
>> - close(p1[1]);
>> - close(p2[0]);
>> + if (str_op && !strcmp(str_op, "clone")) {
>> + tst_res(TINFO, "Spawning isolated process");
>> - if (read(p1[0], buf, strlen("go") + 1) < 0) {
>> - printf("read(p1[0], ...) failed: %s\n", strerror(errno));
>> - exit(1);
>> - }
>> - mqd = tst_syscall(__NR_mq_open, NOSLASH_MQ1, O_RDONLY);
>> - if (mqd == -1) {
>> - if (write(p2[1], "notfnd", strlen("notfnd") + 1) < 0) {
>> - perror("write(p2[1], ...) failed");
>> - exit(1);
>> + if (!SAFE_CLONE(&clone_args)) {
>> + TST_EXP_FAIL(mq_open(MQNAME, O_RDONLY), ENOENT);
>> + return;
>> + }
>> + } else if (str_op && !strcmp(str_op, "unshare")) {
>> + tst_res(TINFO, "Spawning unshared process");
>> +
>> + if (!SAFE_FORK()) {
>> + SAFE_UNSHARE(CLONE_NEWIPC);
>> + TST_EXP_FAIL(mq_open(MQNAME, O_RDONLY), ENOENT);
>> + return;
>> }
>> } else {
>> - if (write(p2[1], "exists", strlen("exists") + 1) < 0) {
>> - perror("write(p2[1], \"exists\", 7) failed");
>> - exit(1);
>> - } else if (mq_close(mqd) < 0) {
>> - perror("mq_close(mqd) failed");
>> - exit(1);
>> + tst_res(TINFO, "Spawning plain process");
>> +
>> + if (!SAFE_FORK()) {
>> + TST_EXP_POSITIVE(mq_open(MQNAME, O_RDONLY));
>> + return;
>> }
>> }
>> -
>> - exit(0);
>> }
>> static void setup(void)
>> {
>> - tst_require_root();
>> - check_mqns();
>> + mqd = SAFE_MQ_OPEN(MQNAME, O_RDWR | O_CREAT | O_EXCL, 0777, NULL);
>> }
>> -int main(int argc, char *argv[])
>> +static void cleanup(void)
>> {
>> - int r;
>> - mqd_t mqd;
>> - char buf[30];
>> - int use_clone = T_UNSHARE;
>> -
>> - setup();
>> -
>> - if (argc == 2 && strcmp(argv[1], "-clone") == 0) {
>> - tst_resm(TINFO,
>> - "Testing posix mq namespaces through clone(2).");
>> - use_clone = T_CLONE;
>> - } else
>> - tst_resm(TINFO,
>> - "Testing posix mq namespaces through unshare(2).");
>> -
>> - if (pipe(p1) == -1 || pipe(p2) == -1) {
>> - tst_brkm(TBROK | TERRNO, NULL, "pipe failed");
>> - }
>> -
>> - mqd = tst_syscall(__NR_mq_open, NOSLASH_MQ1, O_RDWR | O_CREAT | O_EXCL,
>> - 0777, NULL);
>> - if (mqd == -1) {
>> - perror("mq_open");
>> - tst_brkm(TFAIL, NULL, "mq_open failed");
>> + if (mqd != -1) {
>> + SAFE_MQ_CLOSE(mqd);
>> + SAFE_MQ_UNLINK(MQNAME);
>> }
>> -
>> - tst_resm(TINFO, "Checking namespaces isolation from parent to child");
>> - /* fire off the test */
>> - r = do_clone_unshare_test(use_clone, CLONE_NEWIPC, check_mqueue, NULL);
>> - if (r < 0) {
>> - tst_resm(TFAIL, "failed clone/unshare");
>> - mq_close(mqd);
>> - tst_syscall(__NR_mq_unlink, NOSLASH_MQ1);
>> - tst_exit();
>> - }
>> -
>> - close(p1[0]);
>> - close(p2[1]);
>> - if (write(p1[1], "go", strlen("go") + 1) < 0)
>> - tst_resm(TBROK | TERRNO, "write(p1[1], \"go\", ...) failed");
> The old version actually communicate between parent and child proces over pipe
> (p1, p2 arrays). Is it all of these useless? I wonder myself what have POSIX
> message queues together with pipes.
pipes were used because LTP didn't support tests result from children.
> I'm sorry if I overlook discussion about it in the past (looked at various
> versions; it'd be worth to mention changes like this in the commit message).
>
> Kind regards,
> Petr
>
>> - else if (read(p2[0], buf, 7) < 0)
>> - tst_resm(TBROK | TERRNO, "read(p2[0], buf, ...) failed");
>> - else {
>> - if (!strcmp(buf, "exists")) {
>> - tst_resm(TFAIL, "child process found mqueue");
>> - } else if (!strcmp(buf, "notfnd")) {
>> - tst_resm(TPASS, "child process didn't find mqueue");
>> - } else {
>> - tst_resm(TFAIL, "UNKNOWN RESULT");
>> - }
>> - }
>> -
>> - /* destroy the mqueue */
>> - if (mq_close(mqd) == -1) {
>> - tst_brkm(TBROK | TERRNO, NULL, "mq_close failed");
>> - }
>> - tst_syscall(__NR_mq_unlink, NOSLASH_MQ1);
>> -
>> - tst_exit();
>> }
>> +
>> +static struct tst_test test = {
>> + .test_all = run,
>> + .setup = setup,
>> + .cleanup = cleanup,
>> + .needs_root = 1,
>> + .forks_child = 1,
>> + .options = (struct tst_option[]) {
>> + { "m:", &str_op, "Child process isolation <clone|unshare>" },
>> + {},
>> + },
>> + .needs_kconfigs = (const char *[]) {
>> + "CONFIG_USER_NS",
>> + NULL
>> + },
>> +};
Andrea
--
Mailing list info: https://lists.linux.it/listinfo/ltp
next prev parent reply other threads:[~2023-05-10 9:49 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-07 12:47 [LTP] [PATCH v6 0/6] Refactor mqns testing suite Andrea Cervesato
2023-03-07 12:47 ` [LTP] [PATCH v6 1/6] Refactor mqns_01 using new LTP API Andrea Cervesato
2023-03-23 10:32 ` Petr Vorel
2023-05-10 9:46 ` Andrea Cervesato via ltp [this message]
2023-03-23 11:17 ` Petr Vorel
2023-05-10 9:56 ` Andrea Cervesato via ltp
2023-03-07 12:47 ` [LTP] [PATCH v6 2/6] Refactor mqns_02 " Andrea Cervesato
2023-03-07 12:47 ` [LTP] [PATCH v6 3/6] Refactor mqns_03 " Andrea Cervesato
2023-03-07 12:47 ` [LTP] [PATCH v6 4/6] Refactor mqns_04 " Andrea Cervesato
2023-03-07 12:47 ` [LTP] [PATCH v6 5/6] Remove deprecated header files from mqns suite Andrea Cervesato
2023-03-07 12:47 ` [LTP] [PATCH v6 6/6] Remove libclone dependency " Andrea Cervesato
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=673bbf70-a00d-2a19-ce4b-b28b7633844a@suse.com \
--to=ltp@lists.linux.it \
--cc=andrea.cervesato@suse.com \
--cc=andrea.cervesato@suse.de \
--cc=pvorel@suse.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox