[LTP] [PATCH v3 2/3] syscalls/pipe2_02: Add new test for pipe2 O_CLOEXEC flag
Yang Xu
xuyang2018.jy@cn.fujitsu.com
Tue Apr 21 11:41:59 CEST 2020
Hi Li
>
>
> On Thu, Apr 16, 2020 at 3:29 PM Yang Xu <xuyang2018.jy@cn.fujitsu.com
> <mailto:xuyang2018.jy@cn.fujitsu.com>> wrote:
>
> Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com
> <mailto:xuyang2018.jy@cn.fujitsu.com>>
> ---
> runtest/syscalls | 1 +
> testcases/kernel/syscalls/pipe2/.gitignore | 2 +
> testcases/kernel/syscalls/pipe2/pipe2_02.c | 69 +++++++++++++++++++
> .../kernel/syscalls/pipe2/pipe2_02_child.c | 26 +++++++
> 4 files changed, 98 insertions(+)
> create mode 100644 testcases/kernel/syscalls/pipe2/pipe2_02.c
> create mode 100644 testcases/kernel/syscalls/pipe2/pipe2_02_child.c
>
> diff --git a/runtest/syscalls b/runtest/syscalls
> index 79b671d50..44254d7da 100644
> --- a/runtest/syscalls
> +++ b/runtest/syscalls
> @@ -911,6 +911,7 @@ pipe12 pipe12
> pipe13 pipe13
>
> pipe2_01 pipe2_01
> +pipe2_02 pipe2_02
>
> pivot_root01 pivot_root01
>
> diff --git a/testcases/kernel/syscalls/pipe2/.gitignore
> b/testcases/kernel/syscalls/pipe2/.gitignore
> index 42350bbdc..786222de2 100644
> --- a/testcases/kernel/syscalls/pipe2/.gitignore
> +++ b/testcases/kernel/syscalls/pipe2/.gitignore
> @@ -1 +1,3 @@
> /pipe2_01
> +/pipe2_02
> +/pipe2_02_child
> diff --git a/testcases/kernel/syscalls/pipe2/pipe2_02.c
> b/testcases/kernel/syscalls/pipe2/pipe2_02.c
> new file mode 100644
> index 000000000..743d78c58
> --- /dev/null
> +++ b/testcases/kernel/syscalls/pipe2/pipe2_02.c
> @@ -0,0 +1,69 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (c) 2020 FUJITSU LIMITED. All rights reserved.
> + * Author: Yang Xu <xuyang2018.jy@cn.fujitsu.com
> <mailto:xuyang2018.jy@cn.fujitsu.com>>
> + *
> + * This case is designed to test the basic functionality about the
> + * O_CLOEXEC flag of pipe2.
> + */
> +#define _GNU_SOURCE
> +#include <stdio.h>
> +#include <unistd.h>
> +#include <stdlib.h>
> +#include "lapi/fcntl.h"
> +#include "tst_test.h"
> +
> +#define TESTBIN "pipe2_02_child"
> +static int fds[2];
> +
> +static void cleanup(void)
> +{
> + if (fds[0] > 0)
> + SAFE_CLOSE(fds[0]);
> + if (fds[1] > 0)
> + SAFE_CLOSE(fds[1]);
> +}
> +
> +static void verify_pipe2(void)
> +{
> + int pid, status;
> + char buf[20];
> +
> + SAFE_PIPE2(fds, O_CLOEXEC);
> + sprintf(buf, "%d", fds[1]);
> + pid = SAFE_FORK();
> + if (pid == 0) {
> + if (execlp(TESTBIN, TESTBIN, buf, NULL))
> + exit(2);
>
>
> Do we really need the if() condition and exit(2)? AFAIK, the exec()
> family of functions replaces the current process image with a new
> process and returns zero if succeeded.
If failed, it will return -1. So we can catch 2(exit code) in the
following code, but SAFE_EXECLP is also ok.
>
> + }
> +
> + SAFE_WAIT(&status);
> + if (WIFEXITED(status)) {
> + switch (WEXITSTATUS(status)) {
> + case 0:
> + tst_res(TPASS, "test O_CLOEXEC for pipe2
> success");
> + break;
> + case 1:
> + tst_res(TFAIL, "test O_CLOEXEC for pipe2
> failed");
> + break;
> + default:
> + tst_brk(TBROK, "execlp() failed");
> + }
> + } else {
> + tst_brk(TBROK, "%s exits with unexpected error",
> TESTBIN);
> + }
> + cleanup();
> +}
> +
> +static const char *const resfile[] = {
> + TESTBIN,
> + NULL,
> +};
> +
> +static struct tst_test test = {
> + .resource_files = resfile,
> + .cleanup = cleanup,
> + .forks_child = 1,
> + .needs_root = 1,
> + .test_all = verify_pipe2,
> +};
> diff --git a/testcases/kernel/syscalls/pipe2/pipe2_02_child.c
> b/testcases/kernel/syscalls/pipe2/pipe2_02_child.c
> new file mode 100644
> index 000000000..d5ed68cf7
> --- /dev/null
> +++ b/testcases/kernel/syscalls/pipe2/pipe2_02_child.c
> @@ -0,0 +1,26 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (c) 2020 FUJITSU LIMITED. All rights reserved.
> + * Author: Yang Xu <xuyang2018.jy@cn.fujitsu.com
> <mailto:xuyang2018.jy@cn.fujitsu.com>
> + */
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <errno.h>
> +#include <unistd.h>
> +
> +int main(int argc, char **argv)
> +{
> + int ret;
> + int fd;
> +
> + if (argc != 2) {
> + fprintf(stderr, "Only two arguments: %s <fd>\n",
> argv[0]);
> + exit(1);
> + }
> +
> + fd = atoi(argv[1]);
> + ret = write(fd, "x", 1);
> +
> + return ret != -1;
>
>
> To check if the return value equals -1 maybe not a good idea to confirm
> the 'fd' is closed. That only proof it failed to write "x" to the fd, we
> are not sure if that exists other errors.
>
> What about using the fcntl() in the fd status check?
>
> if (fcntl(fd, F_GETFL) < 0 && errno == EBADF)
> return 0;
>
Looks good to me.
> --
> Regards,
> Li Wang
More information about the ltp
mailing list