All of lore.kernel.org
 help / color / mirror / Atom feed
From: Cyril Hrubis <chrubis@suse.cz>
To: ltp@lists.linux.it
Subject: [LTP] [PATCH] syscalls/open11.c: Fix the failure of opening device special file
Date: Wed, 15 Aug 2018 13:42:20 +0200	[thread overview]
Message-ID: <20180815114220.GA26923@rei> (raw)
In-Reply-To: <1530691252-12500-1-git-send-email-yangx.jy@cn.fujitsu.com>

Hi!
> 1) If temporary directory(TMPDIR/TEMPDIR) is on the mountpoint which
>    is mounted with nodev option(or temporary directory is mounted with
>    with nodev option directly), open(2) has no permission to open device
>    special file in the temporary directory and failed as expected.  as below:
>    --------------------------------------------------------------------------
>    open11.c:351: Open device special file O_RDONLY - expected errno 0 - Got: TEST_ERRNO=EACCES(13): Permission denied
>    open11.c:351: Open device special file O_WRONLY - expected errno 0 - Got: TEST_ERRNO=EACCES(13): Permission denied
>    open11.c:351: Open device special file O_RDWR - expected errno 0 - Got: TEST_ERRNO=EACCES(13): Permission denied
>    --------------------------------------------------------------------------
>    We try to fix this issue by creating device special file in /dev/ instead.

As I said earlier, I do not like much that we are messing up with in the
/dev/ directory. Maybe we need to add a test library flag, something as
.needs_devfs into the test library that would prepare a suitable
filesystem in a defined place for us. That way we can solve the issue in
a single place and once for all. I can look into that later on.

> 2) Cleanup && Convert to new API.

This should have gone in a separate patch anyway, so I've removed the
/dev/ related bit and did a few changes so that it compiles and also
added .needs_root flag which was missing after the conversion and
pushed, thanks.

> Signed-off-by: Xiao Yang <yangx.jy@cn.fujitsu.com>
> ---
>  testcases/kernel/syscalls/open/open11.c | 165 +++++++++-----------------------
>  1 file changed, 45 insertions(+), 120 deletions(-)
> 
> diff --git a/testcases/kernel/syscalls/open/open11.c b/testcases/kernel/syscalls/open/open11.c
> index 78002f3..c540eb8 100644
> --- a/testcases/kernel/syscalls/open/open11.c
> +++ b/testcases/kernel/syscalls/open/open11.c
> @@ -1,28 +1,7 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
>  /*
>   * Copyright (C) 2013 Red Hat, Inc.
>   *
> - * This program is free software; you can redistribute it and/or
> - * modify it under the terms of version 2 of the GNU General Public
> - * License as published by the Free Software Foundation.
> - *
> - * This program is distributed in the hope that it would be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
> - *
> - * Further, this software is distributed without any warranty that it
> - * is free of the rightful claim of any third person regarding
> - * infringement or the like.  Any license provided herein, whether
> - * implied or otherwise, applies only to this software file.  Patent
> - * licenses, if any, provided herein do not apply to combinations of
> - * this program with other software, or any other product whatsoever.
> - *
> - * You should have received a copy of the GNU General Public License
> - * along with this program; if not, write the Free Software
> - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
> - * 02110-1301, USA.
> - */
> -
> -/*
>   * Basic tests for open(2) and make sure open(2) works and handles error
>   * conditions correctly.
>   *
> @@ -60,25 +39,15 @@
>   */
>  
>  #define _GNU_SOURCE
> -#include "config.h"
> +#include <errno.h>
> +#include <sys/sysmacros.h>
>  #include <sys/types.h>
>  #include <sys/stat.h>
> -#include <sys/sysmacros.h>
> -#include <sys/wait.h>
> -#include <errno.h>
>  #include <fcntl.h>
>  #include <unistd.h>
> -#include <signal.h>
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <string.h>
> -
> -#include "test.h"
> -#include "safe_macros.h"
>  
> -char *TCID = "open11";
> +#include "tst_test.h"
>  
> -/* Define test files */
>  #define T_REG "t_reg"			/* regular file with content */
>  #define T_REG_EMPTY "t_reg_empty"	/* empty regular file */
>  #define T_LINK_REG "t_link_reg"		/* hard link to T_REG */
> @@ -86,24 +55,18 @@ char *TCID = "open11";
>  #define T_SYMLINK_REG "t_symlink_reg"	/* symlink to T_REG */
>  #define T_DIR "t_dir"			/* test dir */
>  #define T_SYMLINK_DIR "t_symlink_dir"	/* symlink to T_DIR */
> -#define T_DEV "t_dev"			/* test device special file */
> +#define T_DEV "/dev/t_dev"		/* test device special file */
>  
>  #define T_MSG "this is a test string"
>  
> -static void setup(void);
> -static void cleanup(void);
> -
> -struct test_case {
> +static struct test_case {
>  	char *desc;
>  	char *path;
>  	int flags;
>  	mode_t mode;
>  	int err;
> -};
> -struct test_case tc[] = {
> -	/*
> -	 * Test open(2) regular file
> -	 */
> +} tc[] = {
> +	/* Test open(2) regular file */
>  	{	/* open regular file O_RDONLY */
>  		.desc = "Open regular file O_RDONLY",
>  		.path = T_REG_EMPTY,
> @@ -139,9 +102,7 @@ struct test_case tc[] = {
>  		.mode = 0644,
>  		.err = 0,
>  	},
> -	/*
> -	 * Test open(2) directory
> -	 */
> +	/* Test open(2) directory */
>  	{	/* open dir O_RDONLY */
>  		.desc = "Open dir O_RDONLY",
>  		.path = T_DIR,
> @@ -163,9 +124,7 @@ struct test_case tc[] = {
>  		.mode = 0644,
>  		.err = ENOTDIR,
>  	},
> -	/*
> -	 * Test open(2) hard link
> -	 */
> +	/* Test open(2) hard link */
>  	{	/* open hard link file O_RDONLY */
>  		.desc = "Open hard link file O_RDONLY",
>  		.path = T_LINK_REG,
> @@ -187,9 +146,7 @@ struct test_case tc[] = {
>  		.mode = 0644,
>  		.err = 0,
>  	},
> -	/*
> -	 * Test open(2) sym link
> -	 */
> +	/* Test open(2) sym link */
>  	{	/* open sym link file O_RDONLY */
>  		.desc = "Open sym link file O_RDONLY",
>  		.path = T_SYMLINK_REG,
> @@ -232,9 +189,7 @@ struct test_case tc[] = {
>  		.mode = 0644,
>  		.err = EISDIR,
>  	},
> -	/*
> -	 * Test open(2) device special
> -	 */
> +	/* * Test open(2) device special */
>  	{	/* open device special file O_RDONLY */
>  		.desc = "Open device special file O_RDONLY",
>  		.path = T_DEV,
> @@ -256,9 +211,7 @@ struct test_case tc[] = {
>  		.mode = 0644,
>  		.err = 0,
>  	},
> -	/*
> -	 * Test open(2) non-existing file
> -	 */
> +	/* * Test open(2) non-existing file */
>  	{	/* open non-existing regular file in existing dir */
>  		.desc = "Open non-existing regular file in existing dir",
>  		.path = T_DIR"/"T_NEW_REG,
> @@ -266,9 +219,7 @@ struct test_case tc[] = {
>  		.mode = 0644,
>  		.err = 0,
>  	},
> -	/*
> -	 * test open(2) with O_CREAT
> -	 */
> +	/* test open(2) with O_CREAT */
>  	{	/* open hard link file O_RDONLY | O_CREAT */
>  		.desc = "Open link file O_RDONLY | O_CREAT",
>  		.path = T_LINK_REG,
> @@ -304,9 +255,7 @@ struct test_case tc[] = {
>  		.mode = 0644,
>  		.err = EISDIR,
>  	},
> -	/*
> -	 * Other random open(2) tests
> -	 */
> +	/* Other random open(2) tests */
>  	{	/* open regular file O_RDONLY | O_TRUNC */
>  		.desc = "Open regular file O_RDONLY | O_TRUNC, "
>  			"behaviour is undefined but should not oops or hang",
> @@ -325,42 +274,22 @@ struct test_case tc[] = {
>  	},
>  };
>  
> -int TST_TOTAL = sizeof(tc) / sizeof(tc[0]);
> -
> -int main(int argc, char *argv[])
> +static void verify_open(unsigned int n)
>  {
> -	int lc;
> -	int i;
>  	int fd;
> -	int ret;
>  
> -	tst_parse_opts(argc, argv, NULL, NULL);
> +	TEST(open(tc[n].path, tc[n].flags, tc[n].mode));
> +	fd = TEST_RETURN;
>  
> -	setup();
> -
> -	for (lc = 0; TEST_LOOPING(lc); lc++) {
> -		for (i = 0; i < TST_TOTAL; i++) {
> -			TEST(open(tc[i].path, tc[i].flags, tc[i].mode));
> -			fd = TEST_RETURN;
> -
> -			if (tc[i].err == -1 || TEST_ERRNO == tc[i].err) {
> -				tst_resm(TPASS, "%s", tc[i].desc);
> -			} else {
> -				tst_resm(TFAIL | TTERRNO,
> -					 "%s - expected errno %d - Got",
> -					 tc[i].desc, tc[i].err);
> -			}
> -			if (fd > 0) {
> -				ret = close(fd);
> -				if (ret < 0)
> -					tst_resm(TWARN, "%s - close failed: %s",
> -						 tc[i].desc, strerror(errno));
> -			}
> -		}
> +	if (tc[n].err == -1 || TEST_ERRNO == tc[n].err) {
> +		tst_res(TPASS, "%s", tc[n].desc);
> +	} else {
> +		tst_res(TFAIL | TTERRNO, "%s - expected errno %d - Got",
> +			tc[n].desc, tc[n].err);
>  	}
>  
> -	cleanup();
> -	tst_exit();
> +	if (fd > 0)
> +		SAFE_CLOSE(fd);
>  }
>  
>  static void setup(void)
> @@ -368,36 +297,32 @@ static void setup(void)
>  	int fd;
>  	int ret;
>  
> -	tst_require_root();
> -
> -	tst_tmpdir();
> -
> -	/* Create test files */
> -	fd = SAFE_OPEN(cleanup, T_REG, O_WRONLY | O_CREAT, 0644);
> +	fd = SAFE_OPEN(T_REG, O_WRONLY | O_CREAT, 0644);
>  	ret = write(fd, T_MSG, sizeof(T_MSG));
>  	if (ret == -1) {
> -		close(fd);
> -		tst_brkm(TBROK | TERRNO, cleanup, "Write %s failed", T_REG);
> +		SAFE_CLOSE(fd);
> +		tst_brk(TBROK | TERRNO, "Write %s failed", T_REG);
>  	}
> -	close(fd);
> -
> -	fd = SAFE_CREAT(cleanup, T_REG_EMPTY, 0644);
> -	close(fd);
> -
> -	SAFE_LINK(cleanup, T_REG, T_LINK_REG);
> -	SAFE_SYMLINK(cleanup, T_REG, T_SYMLINK_REG);
> -	SAFE_MKDIR(cleanup, T_DIR, 0755);
> -	SAFE_SYMLINK(cleanup, T_DIR, T_SYMLINK_DIR);
> +	SAFE_CLOSE(fd);
>  
> -	ret = mknod(T_DEV, S_IFCHR, makedev(1, 5));
> -	if (ret == -1)
> -		tst_brkm(TBROK | TERRNO, cleanup, "Create char dev %s failed",
> -			 T_DEV);
> -
> -	TEST_PAUSE;
> +	SAFE_TOUCH(T_REG_EMPTY, 0644, NULL);
> +	SAFE_LINK(T_REG, T_LINK_REG);
> +	SAFE_SYMLINK(T_REG, T_SYMLINK_REG);
> +	SAFE_MKDIR(T_DIR, 0755);
> +	SAFE_SYMLINK(T_DIR, T_SYMLINK_DIR);
> +	SAFE_MKNOD(T_DEV, S_IFCHR, makedev(1, 5));
>  }
>  
>  static void cleanup(void)
>  {
> -	tst_rmdir();
> +	if (!access(T_DEV, F_OK))
> +		SAFE_UNLINK(T_DEV);
>  }
> +
> +static struct tst_test test = {
> +	.tcnt = ARRAY_SIZE(tc),
> +	.setup = setup,
> +	.cleanup = cleanup,
> +	.test = verify_open,
> +	.needs_tmpdir = 1,
> +};
> -- 
> 1.8.3.1
> 
> 
> 
> 
> -- 
> Mailing list info: https://lists.linux.it/listinfo/ltp

-- 
Cyril Hrubis
chrubis@suse.cz

  parent reply	other threads:[~2018-08-15 11:42 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-07-04  8:00 [LTP] [PATCH] syscalls/open11.c: Fix the failure of opening device special file Xiao Yang
2018-07-23  1:42 ` Xiao Yang
2018-08-15 11:42 ` Cyril Hrubis [this message]
2018-08-16  8:45   ` [LTP] [PATCH v2 1/4] lib/tst_path_has_mnt_flags.c: Factor out tst_path_has_mnt_flags() for new API Xiao Yang
2018-08-16  8:45     ` [LTP] [PATCH v2 2/4] lib/tst_test.c: add .needs_devfs flag Xiao Yang
2018-08-16 13:28       ` Cyril Hrubis
2018-08-17  4:26         ` Xiao Yang
2018-08-17  4:33         ` [LTP] [PATCH v3 2/2] lib/tst_test.c: Add " Xiao Yang
2018-08-30 14:49           ` Cyril Hrubis
2018-08-31  2:58             ` Xiao Yang
2018-09-01  4:07             ` [LTP] [PATCH v4 " Xiao Yang
2018-08-31 12:31               ` Cyril Hrubis
2018-09-03  2:14                 ` Xiao Yang
2018-09-03 13:01                   ` Cyril Hrubis
2018-08-16  8:45     ` [LTP] [PATCH v2 3/4] syscalls/open11.c: Fix the failure of opening device special files Xiao Yang
2018-08-16  8:45     ` [LTP] [PATCH v2 4/4] syscalls/fsetxattr02.c: Fix the failure of opening device files Xiao Yang

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=20180815114220.GA26923@rei \
    --to=chrubis@suse.cz \
    --cc=ltp@lists.linux.it \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.