All of lore.kernel.org
 help / color / mirror / Atom feed
* [LTP] [PATCH V3 1/3] syscalls: select: Merge few tests and migrate to new format
@ 2020-09-08  9:44 Viresh Kumar
  2020-09-08  9:44 ` [LTP] [PATCH V3 2/3] syscalls: select: Verify that data is available to read Viresh Kumar
                   ` (3 more replies)
  0 siblings, 4 replies; 17+ messages in thread
From: Viresh Kumar @ 2020-09-08  9:44 UTC (permalink / raw)
  To: ltp

This merges the first three tests and updates them to new test format.

Acked-by: Li Wang <liwang@redhat.com>
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
---
V3:
- Improved print message
- Improved comment at the top

 runtest/quickhit                            |   8 +-
 runtest/syscalls                            |   2 -
 testcases/kernel/syscalls/select/.gitignore |   2 -
 testcases/kernel/syscalls/select/select01.c | 168 ++++++++------------
 testcases/kernel/syscalls/select/select02.c | 114 -------------
 testcases/kernel/syscalls/select/select03.c | 134 ----------------
 6 files changed, 66 insertions(+), 362 deletions(-)
 delete mode 100644 testcases/kernel/syscalls/select/select02.c
 delete mode 100644 testcases/kernel/syscalls/select/select03.c

diff --git a/runtest/quickhit b/runtest/quickhit
index b17318b655fa..c01dc4f30b9f 100644
--- a/runtest/quickhit
+++ b/runtest/quickhit
@@ -179,14 +179,8 @@ rename02 rename02
 sbrk01 sbrk01
 # Basic test for sbrk(2)
 select01 select01
-# select to a file
-#    TEST CASES
-#      1.) select(2) to a fd of regular file with no I/O and small timeout
-select02 select02
-# select of system pipe fds
-select03 select03
+# Basic select tests
 select04 select04
-# select of fd of a named-pipe (FIFO)
 setgid01 setgid01
 # Basic test for setgid(2)
 setpgid01 setpgid01
diff --git a/runtest/syscalls b/runtest/syscalls
index 35770e6db4a5..cf8e989969e5 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -1150,8 +1150,6 @@ sched_getattr01 sched_getattr01
 sched_getattr02 sched_getattr02
 
 select01 select01
-select02 select02
-select03 select03
 select04 select04
 
 semctl01 semctl01
diff --git a/testcases/kernel/syscalls/select/.gitignore b/testcases/kernel/syscalls/select/.gitignore
index 9d64cb8b8a1b..243a092ac6ca 100644
--- a/testcases/kernel/syscalls/select/.gitignore
+++ b/testcases/kernel/syscalls/select/.gitignore
@@ -1,4 +1,2 @@
 /select01
-/select02
-/select03
 /select04
diff --git a/testcases/kernel/syscalls/select/select01.c b/testcases/kernel/syscalls/select/select01.c
index e9100c78e9b5..1213aa931251 100644
--- a/testcases/kernel/syscalls/select/select01.c
+++ b/testcases/kernel/syscalls/select/select01.c
@@ -1,126 +1,88 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
 /*
  * Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
- *
- * 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.
- *
- * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
- * Mountain View, CA  94043, or:
- *
  * http://www.sgi.com
  *
- * For further information regarding this notice, see:
- *
- * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
- */
-/*
- *    AUTHOR            : Richard Logan
- *    CO-PILOT          : William Roske
- *    DATE STARTED      : 02/24/93
+ * AUTHOR            : Richard Logan
+ * CO-PILOT          : William Roske
  *
- *      1.) select(2) to a fd of regular file with no I/O and small timeout
+ * 1.) select(2) to fd of regular file with no I/O and small timeout
+ * 2.) select(2) to fd of system pipe with no I/O and small timeout
+ * 3.) select(2) of fd of a named-pipe (FIFO) with no I/O and small timeout value
  */
 
+#include <unistd.h>
 #include <errno.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <string.h>
-#include <sys/param.h>
-#include <sys/types.h>
 #include <sys/time.h>
-
-#include "test.h"
-
-#define FILENAME	"select01"
-
-static void setup(void);
-static void cleanup(void);
-
-char *TCID = "select01";
-int TST_TOTAL = 1;
-
-int Fd = -1;
-fd_set Readfds;
-
-int main(int ac, char **av)
+#include <sys/types.h>
+#include <fcntl.h>
+#include "select_var.h"
+
+static fd_set readfds_reg, readfds_pipe, writefds_pipe, readfds_npipe, writefds_npipe;
+static int fd_reg, fds_pipe[2], fd_npipe;
+
+static struct select_info {
+	int *nfds;
+	fd_set *readfds;
+	fd_set *writefds;
+	char *desc;
+} tests[] = {
+	{&fd_reg, &readfds_reg, NULL, "with regular file"},
+	{&fds_pipe[1], &readfds_pipe, &writefds_pipe, "with system pipe"},
+	{&fd_npipe, &readfds_npipe, &writefds_npipe, "with named pipe (FIFO)"},
+};
+
+static void run(unsigned int n)
 {
-	int lc;
+	struct select_info *tc = &tests[n];
 	struct timeval timeout;
-	long test_time = 0;	/* in usecs */
-
-	tst_parse_opts(ac, av, NULL, NULL);
-
-	setup();
-
-	for (lc = 0; TEST_LOOPING(lc); lc++) {
-		tst_count = 0;
-
-		test_time = ((lc % 2000) * 100000);	/* 100 milli-seconds */
-
-		if (test_time > 1000000 * 60)
-			test_time = test_time % (1000000 * 60);
-
-		timeout.tv_sec = test_time / 1000000;
-		timeout.tv_usec = test_time - (timeout.tv_sec * 1000000);
 
-		TEST(select(4, &Readfds, 0, 0, &timeout));
+	timeout.tv_sec = 0;
+	timeout.tv_usec = 100000;
 
-		if (TEST_RETURN == -1) {
-			tst_resm(TFAIL,
-				 "%d select(4, &Readfds, 0, 0, &timeout), timeout = %ld usecs, errno=%d",
-				 lc, test_time, errno);
-		}
+	TEST(do_select(*tc->nfds + 1, tc->readfds, tc->writefds, 0, &timeout));
 
-		tst_resm(TPASS,
-			 "select(4, &Readfds, 0, 0, &timeout) timeout = %ld usecs",
-			 test_time);
-
-	}
-
-	cleanup();
-	tst_exit();
+	if (TST_RET == -1)
+		tst_res(TFAIL | TTERRNO, "select() failed %s", tc->desc);
+	else
+		tst_res(TPASS, "select() passed %s", tc->desc);
 }
 
 static void setup(void)
 {
-	tst_sig(FORK, DEF_HANDLER, cleanup);
-
-	TEST_PAUSE;
-
-	tst_tmpdir();
-
-	if ((Fd = open(FILENAME, O_CREAT | O_RDWR, 0777)) == -1)
-		tst_brkm(TBROK | TERRNO, cleanup,
-			 "open(%s, O_CREAT | O_RDWR) failed", FILENAME);
-
-	FD_ZERO(&Readfds);
-	FD_SET(Fd, &Readfds);
+	select_info();
+
+	/* Regular file */
+	fd_reg = SAFE_OPEN("tmpfile1", O_CREAT | O_RDWR, 0777);
+	FD_ZERO(&readfds_reg);
+	FD_SET(fd_reg, &readfds_reg);
+
+	/* System pipe*/
+	SAFE_PIPE(fds_pipe);
+	FD_ZERO(&readfds_pipe);
+	FD_ZERO(&writefds_pipe);
+	FD_SET(fds_pipe[0], &readfds_pipe);
+	FD_SET(fds_pipe[1], &writefds_pipe);
+
+	/* Named pipe (FIFO) */
+	SAFE_MKFIFO("tmpfile2", 0666);
+	fd_npipe = SAFE_OPEN("tmpfile2", O_RDWR);
+	FD_ZERO(&readfds_npipe);
+	FD_ZERO(&writefds_npipe);
+	FD_SET(fd_npipe, &readfds_npipe);
+	FD_SET(fd_npipe, &writefds_npipe);
 }
 
 static void cleanup(void)
 {
-	if (Fd >= 0) {
-		if (close(Fd) == -1)
-			tst_resm(TWARN | TERRNO, "close(%s) failed", FILENAME);
-		Fd = -1;
-	}
-
-	tst_rmdir();
+	SAFE_UNLINK("tmpfile2");
 }
+
+static struct tst_test test = {
+	.test = run,
+	.tcnt = ARRAY_SIZE(tests),
+	.test_variants = TEST_VARIANTS,
+	.setup = setup,
+	.cleanup = cleanup,
+	.needs_tmpdir = 1,
+};
diff --git a/testcases/kernel/syscalls/select/select02.c b/testcases/kernel/syscalls/select/select02.c
deleted file mode 100644
index 7aa0107c0ce1..000000000000
--- a/testcases/kernel/syscalls/select/select02.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
- *
- * 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.
- *
- * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
- * Mountain View, CA  94043, or:
- *
- * http://www.sgi.com
- *
- * For further information regarding this notice, see:
- *
- * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
- *
- */
-/*
- *    AUTHOR            : Richard Logan
- *    CO-PILOT          : Glen Overby
- *    DATE STARTED      : 02/24/93
- *
- *    TEST CASES
- *      1.) select(2) to fd of system pipe with no I/O and small timeout
- */
-#include <errno.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/time.h>
-
-#include "test.h"
-#include "safe_macros.h"
-
-static void setup(void);
-
-char *TCID = "select02";
-int TST_TOTAL = 1;
-
-int Fd[2];
-fd_set saved_Readfds, saved_Writefds;
-fd_set Readfds, Writefds;
-
-int main(int ac, char **av)
-{
-	int lc;
-	struct timeval timeout;
-	long test_time = 0;	/* in usecs */
-
-	tst_parse_opts(ac, av, NULL, NULL);
-
-	setup();
-
-	for (lc = 0; TEST_LOOPING(lc); lc++) {
-		tst_count = 0;
-
-		test_time = ((lc % 2000) * 100000);	/* 100 milli-seconds */
-
-		if (test_time > 1000000 * 60)
-			test_time = test_time % (1000000 * 60);
-
-		timeout.tv_sec = test_time / 1000000;
-		timeout.tv_usec = test_time - (timeout.tv_sec * 1000000);
-
-		Readfds = saved_Readfds;
-		Writefds = saved_Writefds;
-
-		TEST(select(5, &Readfds, &Writefds, 0, &timeout));
-
-		if (TEST_RETURN == -1) {
-			tst_resm(TFAIL,
-				 "%d select(5, &Readfds, &Writefds, 0, &timeout) failed, errno=%d\n",
-				 lc, errno);
-		} else {
-			tst_resm(TPASS,
-				 "select(5, &Readfds, &Writefds, 0, &timeout) timeout = %ld usecs",
-				 test_time);
-		}
-
-	}
-
-	tst_exit();
-}
-
-static void setup(void)
-{
-	tst_sig(FORK, DEF_HANDLER, NULL);
-
-	TEST_PAUSE;
-
-	SAFE_PIPE(NULL, Fd);
-
-	FD_ZERO(&saved_Readfds);
-	FD_ZERO(&saved_Writefds);
-	FD_SET(Fd[0], &saved_Readfds);
-	FD_SET(Fd[1], &saved_Writefds);
-}
diff --git a/testcases/kernel/syscalls/select/select03.c b/testcases/kernel/syscalls/select/select03.c
deleted file mode 100644
index da7fdb094173..000000000000
--- a/testcases/kernel/syscalls/select/select03.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
- *
- * 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.
- *
- * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
- * Mountain View, CA  94043, or:
- *
- * http://www.sgi.com
- *
- * For further information regarding this notice, see:
- *
- * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
- *
- */
-/*
- *    AUTHOR            : Richard Logan
- *    CO-PILOT          : Glen Overby
- *    DATE STARTED      : 02/24/93
- *
- *      1.) select(2) of fd of a named-pipe (FIFO) with no I/O and small timeout value
- */
-
-#include <errno.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-
-#include "test.h"
-#include "safe_macros.h"
-
-#define FILENAME	"select03"
-
-static void setup(void);
-static void cleanup(void);
-
-char *TCID = "select03";
-int TST_TOTAL = 1;
-
-int Fd;
-fd_set saved_Readfds, saved_Writefds;
-fd_set Readfds, Writefds;
-
-int main(int ac, char **av)
-{
-	int lc;
-	struct timeval timeout;
-	long test_time = 0;	/* in usecs */
-
-	tst_parse_opts(ac, av, NULL, NULL);
-
-	setup();
-
-	for (lc = 0; TEST_LOOPING(lc); lc++) {
-
-		tst_count = 0;
-
-		test_time = ((lc % 2000) * 100000);	/* 100 milli-seconds */
-
-		if (test_time > 1000000 * 60)
-			test_time = test_time % (1000000 * 60);
-
-		timeout.tv_sec = test_time / 1000000;
-		timeout.tv_usec = test_time - (timeout.tv_sec * 1000000);
-
-		Readfds = saved_Readfds;
-		Writefds = saved_Writefds;
-
-		TEST(select(5, &Readfds, &Writefds, 0, &timeout));
-
-		if (TEST_RETURN == -1) {
-			tst_resm(TFAIL,
-				 "%d select(5, &Readfds, &Writefds, 0, &timeout) failed errno=%d\n",
-				 lc, errno);
-		} else {
-			tst_resm(TPASS,
-				 "select(5, &Readfds, &Writefds, 0, &timeout) timeout = %ld usecs",
-				 test_time);
-		}
-
-	}
-
-	cleanup();
-	tst_exit();
-}
-
-static void setup(void)
-{
-
-	tst_sig(FORK, DEF_HANDLER, cleanup);
-
-	TEST_PAUSE;
-
-	tst_tmpdir();
-
-	SAFE_MKFIFO(cleanup, FILENAME, 0777);
-
-	if ((Fd = open(FILENAME, O_RDWR)) == -1) {
-		tst_brkm(TBROK, cleanup, "open(%s, O_RDWR) failed, errno=%d",
-			 FILENAME, errno);
-	}
-
-	FD_ZERO(&saved_Readfds);
-	FD_ZERO(&saved_Writefds);
-	FD_SET(Fd, &saved_Readfds);
-	FD_SET(Fd, &saved_Writefds);
-}
-
-static void cleanup(void)
-{
-	close(Fd);
-	tst_rmdir();
-}
-- 
2.25.0.rc1.19.g042ed3e048af


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [LTP] [PATCH V3 2/3] syscalls: select: Verify that data is available to read
  2020-09-08  9:44 [LTP] [PATCH V3 1/3] syscalls: select: Merge few tests and migrate to new format Viresh Kumar
@ 2020-09-08  9:44 ` Viresh Kumar
  2020-10-14 12:13   ` Cyril Hrubis
  2020-10-21  4:32   ` [LTP] [PATCH V4 " Viresh Kumar
  2020-09-08  9:44 ` [LTP] [PATCH V3 3/3] syscalls: select: Rename select04.c to select02.c Viresh Kumar
                   ` (2 subsequent siblings)
  3 siblings, 2 replies; 17+ messages in thread
From: Viresh Kumar @ 2020-09-08  9:44 UTC (permalink / raw)
  To: ltp

select() returns a positive value on success if timeout hasn't happened,
else returns 0. Check that and send some data to the write file
descriptor for the same.

Acked-by: Li Wang <liwang@redhat.com>
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
---
 testcases/kernel/syscalls/select/select01.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/testcases/kernel/syscalls/select/select01.c b/testcases/kernel/syscalls/select/select01.c
index 1213aa931251..c6b30aa67dd7 100644
--- a/testcases/kernel/syscalls/select/select01.c
+++ b/testcases/kernel/syscalls/select/select01.c
@@ -25,25 +25,32 @@ static struct select_info {
 	int *nfds;
 	fd_set *readfds;
 	fd_set *writefds;
+	int *writefd;
 	char *desc;
 } tests[] = {
-	{&fd_reg, &readfds_reg, NULL, "with regular file"},
-	{&fds_pipe[1], &readfds_pipe, &writefds_pipe, "with system pipe"},
-	{&fd_npipe, &readfds_npipe, &writefds_npipe, "with named pipe (FIFO)"},
+	{&fd_reg, &readfds_reg, NULL, NULL, "with regular file"},
+	{&fds_pipe[1], &readfds_pipe, &writefds_pipe, &fds_pipe[1], "with system pipe"},
+	{&fd_npipe, &readfds_npipe, &writefds_npipe, &fd_npipe, "with named pipe (FIFO)"},
 };
 
 static void run(unsigned int n)
 {
 	struct select_info *tc = &tests[n];
 	struct timeval timeout;
+	char buf;
 
 	timeout.tv_sec = 0;
 	timeout.tv_usec = 100000;
 
+	if (tc->writefd)
+		SAFE_WRITE(0, *tc->writefd, &buf, sizeof(buf));
+
 	TEST(do_select(*tc->nfds + 1, tc->readfds, tc->writefds, 0, &timeout));
 
 	if (TST_RET == -1)
 		tst_res(TFAIL | TTERRNO, "select() failed %s", tc->desc);
+	else if (!TST_RET)
+		tst_res(TFAIL, "select() timed out %s", tc->desc);
 	else
 		tst_res(TPASS, "select() passed %s", tc->desc);
 }
-- 
2.25.0.rc1.19.g042ed3e048af


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [LTP] [PATCH V3 3/3] syscalls: select: Rename select04.c to select02.c
  2020-09-08  9:44 [LTP] [PATCH V3 1/3] syscalls: select: Merge few tests and migrate to new format Viresh Kumar
  2020-09-08  9:44 ` [LTP] [PATCH V3 2/3] syscalls: select: Verify that data is available to read Viresh Kumar
@ 2020-09-08  9:44 ` Viresh Kumar
  2020-10-14 12:15   ` Cyril Hrubis
  2020-10-21  5:32   ` [LTP] [PATCH V2 4/4] syscalls: select: Add failure tests Viresh Kumar
  2020-10-06  7:59 ` [LTP] [PATCH V3 1/3] syscalls: select: Merge few tests and migrate to new format Viresh Kumar
  2020-10-14 12:05 ` Cyril Hrubis
  3 siblings, 2 replies; 17+ messages in thread
From: Viresh Kumar @ 2020-09-08  9:44 UTC (permalink / raw)
  To: ltp

Do the rename.

Acked-by: Li Wang <liwang@redhat.com>
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
---
 runtest/quickhit                                            | 2 +-
 runtest/syscalls                                            | 2 +-
 testcases/kernel/syscalls/select/.gitignore                 | 2 +-
 testcases/kernel/syscalls/select/{select04.c => select02.c} | 0
 4 files changed, 3 insertions(+), 3 deletions(-)
 rename testcases/kernel/syscalls/select/{select04.c => select02.c} (100%)

diff --git a/runtest/quickhit b/runtest/quickhit
index c01dc4f30b9f..9ada4c4c47c2 100644
--- a/runtest/quickhit
+++ b/runtest/quickhit
@@ -180,7 +180,7 @@ sbrk01 sbrk01
 # Basic test for sbrk(2)
 select01 select01
 # Basic select tests
-select04 select04
+select02 select02
 setgid01 setgid01
 # Basic test for setgid(2)
 setpgid01 setpgid01
diff --git a/runtest/syscalls b/runtest/syscalls
index cf8e989969e5..f299c030ecaa 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -1150,7 +1150,7 @@ sched_getattr01 sched_getattr01
 sched_getattr02 sched_getattr02
 
 select01 select01
-select04 select04
+select02 select02
 
 semctl01 semctl01
 semctl02 semctl02
diff --git a/testcases/kernel/syscalls/select/.gitignore b/testcases/kernel/syscalls/select/.gitignore
index 243a092ac6ca..f5a43c23326a 100644
--- a/testcases/kernel/syscalls/select/.gitignore
+++ b/testcases/kernel/syscalls/select/.gitignore
@@ -1,2 +1,2 @@
 /select01
-/select04
+/select02
diff --git a/testcases/kernel/syscalls/select/select04.c b/testcases/kernel/syscalls/select/select02.c
similarity index 100%
rename from testcases/kernel/syscalls/select/select04.c
rename to testcases/kernel/syscalls/select/select02.c
-- 
2.25.0.rc1.19.g042ed3e048af


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [LTP] [PATCH V3 1/3] syscalls: select: Merge few tests and migrate to new format
  2020-09-08  9:44 [LTP] [PATCH V3 1/3] syscalls: select: Merge few tests and migrate to new format Viresh Kumar
  2020-09-08  9:44 ` [LTP] [PATCH V3 2/3] syscalls: select: Verify that data is available to read Viresh Kumar
  2020-09-08  9:44 ` [LTP] [PATCH V3 3/3] syscalls: select: Rename select04.c to select02.c Viresh Kumar
@ 2020-10-06  7:59 ` Viresh Kumar
  2020-10-14 12:05 ` Cyril Hrubis
  3 siblings, 0 replies; 17+ messages in thread
From: Viresh Kumar @ 2020-10-06  7:59 UTC (permalink / raw)
  To: ltp

On 08-09-20, 15:14, Viresh Kumar wrote:
> This merges the first three tests and updates them to new test format.
> 
> Acked-by: Li Wang <liwang@redhat.com>
> Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
> ---
> V3:
> - Improved print message
> - Improved comment at the top

Ping.

-- 
viresh

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [LTP] [PATCH V3 1/3] syscalls: select: Merge few tests and migrate to new format
  2020-09-08  9:44 [LTP] [PATCH V3 1/3] syscalls: select: Merge few tests and migrate to new format Viresh Kumar
                   ` (2 preceding siblings ...)
  2020-10-06  7:59 ` [LTP] [PATCH V3 1/3] syscalls: select: Merge few tests and migrate to new format Viresh Kumar
@ 2020-10-14 12:05 ` Cyril Hrubis
  3 siblings, 0 replies; 17+ messages in thread
From: Cyril Hrubis @ 2020-10-14 12:05 UTC (permalink / raw)
  To: ltp

Hi!
> +static struct select_info {
               ^
	 I've renamed this to struct tcases because we do have a
	 select_info function as well...

And pushed, thanks.

-- 
Cyril Hrubis
chrubis@suse.cz

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [LTP] [PATCH V3 2/3] syscalls: select: Verify that data is available to read
  2020-09-08  9:44 ` [LTP] [PATCH V3 2/3] syscalls: select: Verify that data is available to read Viresh Kumar
@ 2020-10-14 12:13   ` Cyril Hrubis
  2020-10-19 10:10     ` Viresh Kumar
  2020-10-21  4:32   ` [LTP] [PATCH V4 " Viresh Kumar
  1 sibling, 1 reply; 17+ messages in thread
From: Cyril Hrubis @ 2020-10-14 12:13 UTC (permalink / raw)
  To: ltp

Hi!
> select() returns a positive value on success if timeout hasn't happened,
> else returns 0. Check that and send some data to the write file
> descriptor for the same.
> 
> Acked-by: Li Wang <liwang@redhat.com>
> Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
> ---
>  testcases/kernel/syscalls/select/select01.c | 13 ++++++++++---
>  1 file changed, 10 insertions(+), 3 deletions(-)
> 
> diff --git a/testcases/kernel/syscalls/select/select01.c b/testcases/kernel/syscalls/select/select01.c
> index 1213aa931251..c6b30aa67dd7 100644
> --- a/testcases/kernel/syscalls/select/select01.c
> +++ b/testcases/kernel/syscalls/select/select01.c
> @@ -25,25 +25,32 @@ static struct select_info {
>  	int *nfds;
>  	fd_set *readfds;
>  	fd_set *writefds;
> +	int *writefd;
>  	char *desc;
>  } tests[] = {
> -	{&fd_reg, &readfds_reg, NULL, "with regular file"},
> -	{&fds_pipe[1], &readfds_pipe, &writefds_pipe, "with system pipe"},
> -	{&fd_npipe, &readfds_npipe, &writefds_npipe, "with named pipe (FIFO)"},
> +	{&fd_reg, &readfds_reg, NULL, NULL, "with regular file"},
> +	{&fds_pipe[1], &readfds_pipe, &writefds_pipe, &fds_pipe[1], "with system pipe"},
> +	{&fd_npipe, &readfds_npipe, &writefds_npipe, &fd_npipe, "with named pipe (FIFO)"},
>  };
>  
>  static void run(unsigned int n)
>  {
>  	struct select_info *tc = &tests[n];
>  	struct timeval timeout;
> +	char buf;
>  
>  	timeout.tv_sec = 0;
>  	timeout.tv_usec = 100000;
>  
> +	if (tc->writefd)
> +		SAFE_WRITE(0, *tc->writefd, &buf, sizeof(buf));

I'm not sure why we are writing data here. For both the pipe and fifo
the select() will return that we can write there, hence the return would
be non-zero regardless.

Also I would like to be more specific. E.g. expecting specific return
instead of just non-zero and also making sure the right bits are enabled
in the fd sets.

>  	TEST(do_select(*tc->nfds + 1, tc->readfds, tc->writefds, 0, &timeout));
>  
>  	if (TST_RET == -1)
>  		tst_res(TFAIL | TTERRNO, "select() failed %s", tc->desc);
> +	else if (!TST_RET)
> +		tst_res(TFAIL, "select() timed out %s", tc->desc);
>  	else
>  		tst_res(TPASS, "select() passed %s", tc->desc);
>  }
> -- 
> 2.25.0.rc1.19.g042ed3e048af
> 

-- 
Cyril Hrubis
chrubis@suse.cz

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [LTP] [PATCH V3 3/3] syscalls: select: Rename select04.c to select02.c
  2020-09-08  9:44 ` [LTP] [PATCH V3 3/3] syscalls: select: Rename select04.c to select02.c Viresh Kumar
@ 2020-10-14 12:15   ` Cyril Hrubis
  2020-10-19 11:37     ` Viresh Kumar
  2020-10-21  5:32   ` [LTP] [PATCH V2 4/4] syscalls: select: Add failure tests Viresh Kumar
  1 sibling, 1 reply; 17+ messages in thread
From: Cyril Hrubis @ 2020-10-14 12:15 UTC (permalink / raw)
  To: ltp

Hi!
We will have to implement a test for the errors as well, so I wouldn't
rename the test like this yet.

-- 
Cyril Hrubis
chrubis@suse.cz

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [LTP] [PATCH V3 2/3] syscalls: select: Verify that data is available to read
  2020-10-14 12:13   ` Cyril Hrubis
@ 2020-10-19 10:10     ` Viresh Kumar
  2020-10-20 13:06       ` Cyril Hrubis
  0 siblings, 1 reply; 17+ messages in thread
From: Viresh Kumar @ 2020-10-19 10:10 UTC (permalink / raw)
  To: ltp

On 14-10-20, 14:13, Cyril Hrubis wrote:
> Hi!
> > select() returns a positive value on success if timeout hasn't happened,
> > else returns 0. Check that and send some data to the write file
> > descriptor for the same.
> > 
> > Acked-by: Li Wang <liwang@redhat.com>
> > Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
> > ---
> >  testcases/kernel/syscalls/select/select01.c | 13 ++++++++++---
> >  1 file changed, 10 insertions(+), 3 deletions(-)
> > 
> > diff --git a/testcases/kernel/syscalls/select/select01.c b/testcases/kernel/syscalls/select/select01.c
> > index 1213aa931251..c6b30aa67dd7 100644
> > --- a/testcases/kernel/syscalls/select/select01.c
> > +++ b/testcases/kernel/syscalls/select/select01.c
> > @@ -25,25 +25,32 @@ static struct select_info {
> >  	int *nfds;
> >  	fd_set *readfds;
> >  	fd_set *writefds;
> > +	int *writefd;
> >  	char *desc;
> >  } tests[] = {
> > -	{&fd_reg, &readfds_reg, NULL, "with regular file"},
> > -	{&fds_pipe[1], &readfds_pipe, &writefds_pipe, "with system pipe"},
> > -	{&fd_npipe, &readfds_npipe, &writefds_npipe, "with named pipe (FIFO)"},
> > +	{&fd_reg, &readfds_reg, NULL, NULL, "with regular file"},
> > +	{&fds_pipe[1], &readfds_pipe, &writefds_pipe, &fds_pipe[1], "with system pipe"},
> > +	{&fd_npipe, &readfds_npipe, &writefds_npipe, &fd_npipe, "with named pipe (FIFO)"},
> >  };
> >  
> >  static void run(unsigned int n)
> >  {
> >  	struct select_info *tc = &tests[n];
> >  	struct timeval timeout;
> > +	char buf;
> >  
> >  	timeout.tv_sec = 0;
> >  	timeout.tv_usec = 100000;
> >  
> > +	if (tc->writefd)
> > +		SAFE_WRITE(0, *tc->writefd, &buf, sizeof(buf));
> 
> I'm not sure why we are writing data here. For both the pipe and fifo
> the select() will return that we can write there, hence the return would
> be non-zero regardless.

Maybe I haven't understood what you meant when you said this earlier:

  And the coverate in these tests is a bit lacking, we do not have a
  single tests that would send a data over a pipe to a fd select is
  watching and check that select was woken up by that. There is no such
  test in the pselect/ directory either.

> Also I would like to be more specific. E.g. expecting specific return
> instead of just non-zero and also making sure the right bits are enabled
> in the fd sets.

Something like this ?

diff --git a/testcases/kernel/syscalls/select/select01.c b/testcases/kernel/syscalls/select/select01.c
index e4b5caecbb10..4b33c0a01380 100644
--- a/testcases/kernel/syscalls/select/select01.c
+++ b/testcases/kernel/syscalls/select/select01.c
@@ -38,12 +38,15 @@ static void run(unsigned int n)
        struct tcases *tc = &tests[n];
        struct timeval timeout;
        char buf;
+       int exp_ret = 1;
 
        timeout.tv_sec = 0;
        timeout.tv_usec = 100000;
 
-       if (tc->writefd)
+       if (tc->writefd) {
                SAFE_WRITE(0, *tc->writefd, &buf, sizeof(buf));
+               exp_ret++;
+       }
 
        TEST(do_select(*tc->nfds + 1, tc->readfds, tc->writefds, 0, &timeout));
 
@@ -51,6 +54,8 @@ static void run(unsigned int n)
                tst_res(TFAIL | TTERRNO, "select() failed %s", tc->desc);
        else if (!TST_RET)
                tst_res(TFAIL, "select() timed out %s", tc->desc);
+       else if (TST_RET != exp_ret)
+               tst_res(TFAIL, "select() returned incorrect value: %s, expected: %d, got: %lu", tc->desc, exp_ret, TST_RET);
        else
                tst_res(TPASS, "select() passed %s", tc->desc);
 }

-- 
viresh

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [LTP] [PATCH V3 3/3] syscalls: select: Rename select04.c to select02.c
  2020-10-14 12:15   ` Cyril Hrubis
@ 2020-10-19 11:37     ` Viresh Kumar
  2020-10-20 13:06       ` Cyril Hrubis
  0 siblings, 1 reply; 17+ messages in thread
From: Viresh Kumar @ 2020-10-19 11:37 UTC (permalink / raw)
  To: ltp

On 14-10-20, 14:15, Cyril Hrubis wrote:
> Hi!
> We will have to implement a test for the errors as well, so I wouldn't
> rename the test like this yet.

Maybe just pick it up as is (so I don't need to resend it) and then
apply below patch:

-------------------------8<-------------------------

From b35b85ecaab98f3e3711a7f6fc2642c96657ee18 Mon Sep 17 00:00:00 2001
Message-Id: <b35b85ecaab98f3e3711a7f6fc2642c96657ee18.1603107392.git.viresh.kumar@linaro.org>
From: Viresh Kumar <viresh.kumar@linaro.org>
Date: Mon, 19 Oct 2020 17:06:02 +0530
Subject: [PATCH] syscalls: select: Add failure tests

This adds a variety of failure tests to select() syscall.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
---
 runtest/syscalls                            |  1 +
 testcases/kernel/syscalls/select/.gitignore |  1 +
 testcases/kernel/syscalls/select/select03.c | 95 +++++++++++++++++++++
 3 files changed, 97 insertions(+)
 create mode 100644 testcases/kernel/syscalls/select/select03.c

diff --git a/runtest/syscalls b/runtest/syscalls
index 12ae10464d9f..0443f9f3d51b 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -1157,6 +1157,7 @@ sched_getattr02 sched_getattr02
 
 select01 select01
 select02 select02
+select03 select03
 
 semctl01 semctl01
 semctl02 semctl02
diff --git a/testcases/kernel/syscalls/select/.gitignore b/testcases/kernel/syscalls/select/.gitignore
index f5a43c23326a..b6bff2d4f961 100644
--- a/testcases/kernel/syscalls/select/.gitignore
+++ b/testcases/kernel/syscalls/select/.gitignore
@@ -1,2 +1,3 @@
 /select01
 /select02
+/select03
diff --git a/testcases/kernel/syscalls/select/select03.c b/testcases/kernel/syscalls/select/select03.c
new file mode 100644
index 000000000000..2de976cdd977
--- /dev/null
+++ b/testcases/kernel/syscalls/select/select03.c
@@ -0,0 +1,95 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2020 Linaro Ltd.
+ *
+ * Failure tests.
+ */
+
+#include <unistd.h>
+#include <errno.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include "select_var.h"
+
+static fd_set readfds_reg, writefds_reg, fds_closed;
+static fd_set *preadfds_reg = &readfds_reg, *pwritefds_reg = &writefds_reg;
+static fd_set *pfds_closed = &fds_closed, *nullfds = NULL, *faulty_fds;
+static int fd_closed, fd[2];
+static struct timeval timeout;
+static struct timeval *valid_to = &timeout, *invalid_to;
+
+static struct tcases {
+	char *name;
+	int nfds;
+	fd_set **readfds;
+	fd_set **writefds;
+	fd_set **exceptfds;
+	struct timeval **timeout;
+	int exp_errno;
+} tests[] = {
+	{ "Negative nfds", -1, &preadfds_reg, &pwritefds_reg, &nullfds, &valid_to, EINVAL },
+	{ "Invalid readfds", 6, &pfds_closed, &pwritefds_reg, &nullfds, &valid_to, EBADF },
+	{ "Invalid writefds", 6, &preadfds_reg, &pfds_closed, &nullfds, &valid_to, EBADF },
+	{ "Invalid exceptfds", 6, &preadfds_reg, &pwritefds_reg, &pfds_closed, &valid_to, EBADF },
+	{ "Faulty readfds", 6, &faulty_fds, &pwritefds_reg, &nullfds, &valid_to, EFAULT },
+	{ "Faulty writefds", 6, &preadfds_reg, &faulty_fds, &nullfds, &valid_to, EFAULT },
+	{ "Faulty exceptfds", 6, &preadfds_reg, &pwritefds_reg, &faulty_fds, &valid_to, EFAULT },
+	{ "Faulty timeout", 6, &preadfds_reg, &pwritefds_reg, &nullfds, &invalid_to, EFAULT },
+};
+
+static void run(unsigned int n)
+{
+	struct tcases *tc = &tests[n];
+
+	TEST(do_select(tc->nfds, *tc->readfds, *tc->writefds, *tc->exceptfds,
+		       *tc->timeout));
+
+	if (TST_RET != -1) {
+		tst_res(TFAIL, "%s: select() passed unexpectedly", tc->name);
+		return;
+	}
+
+	if (tc->exp_errno != TST_ERR) {
+		tst_res(TFAIL | TTERRNO, "%s: select()() should fail with %s",
+			tc->name, tst_strerrno(tc->exp_errno));
+		return;
+	}
+
+	tst_res(TPASS, "%s: select() failed as expected", tc->name);
+}
+
+static void setup(void)
+{
+	void *faulty_address;
+
+	select_info();
+
+	timeout.tv_sec = 0;
+	timeout.tv_usec = 100000;
+
+	/* Regular file */
+	fd_closed = SAFE_OPEN("tmpfile1", O_CREAT | O_RDWR, 0777);
+	FD_ZERO(&fds_closed);
+	FD_SET(fd_closed, &fds_closed);
+
+	SAFE_PIPE(fd);
+	FD_ZERO(&readfds_reg);
+	FD_ZERO(&writefds_reg);
+	FD_SET(fd[0], &readfds_reg);
+	FD_SET(fd[1], &writefds_reg);
+
+	SAFE_CLOSE(fd_closed);
+
+	faulty_address = tst_get_bad_addr(NULL);
+	invalid_to = faulty_address;
+	faulty_fds = faulty_address;
+}
+
+static struct tst_test test = {
+	.test = run,
+	.tcnt = ARRAY_SIZE(tests),
+	.test_variants = TEST_VARIANTS,
+	.setup = setup,
+	.needs_tmpdir = 1,
+};
-- 
2.25.0.rc1.19.g042ed3e048af


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [LTP] [PATCH V3 2/3] syscalls: select: Verify that data is available to read
  2020-10-19 10:10     ` Viresh Kumar
@ 2020-10-20 13:06       ` Cyril Hrubis
  0 siblings, 0 replies; 17+ messages in thread
From: Cyril Hrubis @ 2020-10-20 13:06 UTC (permalink / raw)
  To: ltp

Hi!
> Maybe I haven't understood what you meant when you said this earlier:
> 
>   And the coverate in these tests is a bit lacking, we do not have a
>   single tests that would send a data over a pipe to a fd select is
>   watching and check that select was woken up by that. There is no such
>   test in the pselect/ directory either.
> 
> > Also I would like to be more specific. E.g. expecting specific return
> > instead of just non-zero and also making sure the right bits are enabled
> > in the fd sets.
> 
> Something like this ?

This is much better, I suppose that we should as well check the
individual bits in the fd_sets to make it perfect.

> diff --git a/testcases/kernel/syscalls/select/select01.c b/testcases/kernel/syscalls/select/select01.c
> index e4b5caecbb10..4b33c0a01380 100644
> --- a/testcases/kernel/syscalls/select/select01.c
> +++ b/testcases/kernel/syscalls/select/select01.c
> @@ -38,12 +38,15 @@ static void run(unsigned int n)
>         struct tcases *tc = &tests[n];
>         struct timeval timeout;
>         char buf;
> +       int exp_ret = 1;
>  
>         timeout.tv_sec = 0;
>         timeout.tv_usec = 100000;
>  
> -       if (tc->writefd)
> +       if (tc->writefd) {
>                 SAFE_WRITE(0, *tc->writefd, &buf, sizeof(buf));
> +               exp_ret++;
> +       }
>  
>         TEST(do_select(*tc->nfds + 1, tc->readfds, tc->writefds, 0, &timeout));
>  
> @@ -51,6 +54,8 @@ static void run(unsigned int n)
>                 tst_res(TFAIL | TTERRNO, "select() failed %s", tc->desc);
>         else if (!TST_RET)
>                 tst_res(TFAIL, "select() timed out %s", tc->desc);
> +       else if (TST_RET != exp_ret)
> +               tst_res(TFAIL, "select() returned incorrect value: %s, expected: %d, got: %lu", tc->desc, exp_ret, TST_RET);
>         else
>                 tst_res(TPASS, "select() passed %s", tc->desc);
>  }
> 
> -- 
> viresh

-- 
Cyril Hrubis
chrubis@suse.cz

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [LTP] [PATCH V3 3/3] syscalls: select: Rename select04.c to select02.c
  2020-10-19 11:37     ` Viresh Kumar
@ 2020-10-20 13:06       ` Cyril Hrubis
  0 siblings, 0 replies; 17+ messages in thread
From: Cyril Hrubis @ 2020-10-20 13:06 UTC (permalink / raw)
  To: ltp

Hi!
> Maybe just pick it up as is (so I don't need to resend it) and then
> apply below patch:

Sure.

-- 
Cyril Hrubis
chrubis@suse.cz

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [LTP] [PATCH V4 2/3] syscalls: select: Verify that data is available to read
  2020-09-08  9:44 ` [LTP] [PATCH V3 2/3] syscalls: select: Verify that data is available to read Viresh Kumar
  2020-10-14 12:13   ` Cyril Hrubis
@ 2020-10-21  4:32   ` Viresh Kumar
  2020-10-21 12:04     ` Cyril Hrubis
  1 sibling, 1 reply; 17+ messages in thread
From: Viresh Kumar @ 2020-10-21  4:32 UTC (permalink / raw)
  To: ltp

select() returns a positive value on success if timeout hasn't happened,
else returns 0. Check that and send some data to the write file
descriptor for the same.

Acked-by: Li Wang <liwang@redhat.com>
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
---
V4:
- test individual bits in the fd_sets to verify properly.

 testcases/kernel/syscalls/select/select01.c | 23 +++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/testcases/kernel/syscalls/select/select01.c b/testcases/kernel/syscalls/select/select01.c
index 74538026adbe..68f813bb24b5 100644
--- a/testcases/kernel/syscalls/select/select01.c
+++ b/testcases/kernel/syscalls/select/select01.c
@@ -25,27 +25,42 @@ static struct tcases {
 	int *nfds;
 	fd_set *readfds;
 	fd_set *writefds;
+	int *readfd;
+	int *writefd;
 	char *desc;
 } tests[] = {
-	{&fd_reg, &readfds_reg, NULL, "with regular file"},
-	{&fds_pipe[1], &readfds_pipe, &writefds_pipe, "with system pipe"},
-	{&fd_npipe, &readfds_npipe, &writefds_npipe, "with named pipe (FIFO)"},
+	{&fd_reg, &readfds_reg, NULL, &fd_reg, NULL, "with regular file"},
+	{&fds_pipe[1], &readfds_pipe, &writefds_pipe, &fds_pipe[0], &fds_pipe[1], "with system pipe"},
+	{&fd_npipe, &readfds_npipe, &writefds_npipe, &fd_npipe, &fd_npipe, "with named pipe (FIFO)"},
 };
 
 static void run(unsigned int n)
 {
 	struct tcases *tc = &tests[n];
 	struct timeval timeout;
+	char buf;
+	int exp_ret = 1;
 
 	timeout.tv_sec = 0;
 	timeout.tv_usec = 100000;
 
+	if (tc->writefd) {
+		SAFE_WRITE(0, *tc->writefd, &buf, sizeof(buf));
+		exp_ret++;
+	}
+
 	TEST(do_select(*tc->nfds + 1, tc->readfds, tc->writefds, 0, &timeout));
 
 	if (TST_RET == -1)
 		tst_res(TFAIL | TTERRNO, "select() failed %s", tc->desc);
-	else
+	else if (!TST_RET)
+		tst_res(TFAIL, "select() timed out %s", tc->desc);
+	else if (TST_RET != exp_ret)
+		tst_res(TFAIL, "select() returned incorrect value %s, expected: %d, got: %lu", tc->desc, exp_ret, TST_RET);
+	else if (FD_ISSET(*tc->readfd, tc->readfds) && (!tc->writefd || FD_ISSET(*tc->writefd, tc->writefds)))
 		tst_res(TPASS, "select() passed %s", tc->desc);
+	else
+		tst_res(TFAIL, "select() returned expected value %s, but all file descriptors aren't ready", tc->desc);
 }
 
 static void setup(void)
-- 
2.25.0.rc1.19.g042ed3e048af


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [LTP] [PATCH V2 4/4] syscalls: select: Add failure tests
  2020-09-08  9:44 ` [LTP] [PATCH V3 3/3] syscalls: select: Rename select04.c to select02.c Viresh Kumar
  2020-10-14 12:15   ` Cyril Hrubis
@ 2020-10-21  5:32   ` Viresh Kumar
  2020-10-21 14:54     ` Cyril Hrubis
  1 sibling, 1 reply; 17+ messages in thread
From: Viresh Kumar @ 2020-10-21  5:32 UTC (permalink / raw)
  To: ltp

This adds a variety of failure tests to select() syscalls. Another
helper is added in select_var.h to make sure we don't access a bad
address while reading/writing the timeout value.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
---
I am resending the patch formally here and marking it as V2 as I fixed
an issue with it.

 runtest/syscalls                              |  1 +
 testcases/kernel/syscalls/select/.gitignore   |  1 +
 testcases/kernel/syscalls/select/select03.c   | 96 +++++++++++++++++++
 testcases/kernel/syscalls/select/select_var.h | 55 ++++++++---
 4 files changed, 138 insertions(+), 15 deletions(-)
 create mode 100644 testcases/kernel/syscalls/select/select03.c

diff --git a/runtest/syscalls b/runtest/syscalls
index 12ae10464d9f..0443f9f3d51b 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -1157,6 +1157,7 @@ sched_getattr02 sched_getattr02
 
 select01 select01
 select02 select02
+select03 select03
 
 semctl01 semctl01
 semctl02 semctl02
diff --git a/testcases/kernel/syscalls/select/.gitignore b/testcases/kernel/syscalls/select/.gitignore
index f5a43c23326a..b6bff2d4f961 100644
--- a/testcases/kernel/syscalls/select/.gitignore
+++ b/testcases/kernel/syscalls/select/.gitignore
@@ -1,2 +1,3 @@
 /select01
 /select02
+/select03
diff --git a/testcases/kernel/syscalls/select/select03.c b/testcases/kernel/syscalls/select/select03.c
new file mode 100644
index 000000000000..9a665b862dce
--- /dev/null
+++ b/testcases/kernel/syscalls/select/select03.c
@@ -0,0 +1,96 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2020 Linaro Ltd.
+ *
+ * Failure tests.
+ */
+
+#include <unistd.h>
+#include <errno.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include "select_var.h"
+
+static fd_set readfds_reg, writefds_reg, fds_closed;
+static fd_set *preadfds_reg = &readfds_reg, *pwritefds_reg = &writefds_reg;
+static fd_set *pfds_closed = &fds_closed, *nullfds = NULL, *faulty_fds;
+static int fd_closed, fd[2];
+static struct timeval timeout;
+static struct timeval *valid_to = &timeout, *invalid_to;
+
+static struct tcases {
+	char *name;
+	int nfds;
+	fd_set **readfds;
+	fd_set **writefds;
+	fd_set **exceptfds;
+	struct timeval **timeout;
+	int exp_errno;
+} tests[] = {
+	{ "Negative nfds", -1, &preadfds_reg, &pwritefds_reg, &nullfds, &valid_to, EINVAL },
+	{ "Invalid readfds", 6, &pfds_closed, &pwritefds_reg, &nullfds, &valid_to, EBADF },
+	{ "Invalid writefds", 6, &preadfds_reg, &pfds_closed, &nullfds, &valid_to, EBADF },
+	{ "Invalid exceptfds", 6, &preadfds_reg, &pwritefds_reg, &pfds_closed, &valid_to, EBADF },
+	{ "Faulty readfds", 6, &faulty_fds, &pwritefds_reg, &nullfds, &valid_to, EFAULT },
+	{ "Faulty writefds", 6, &preadfds_reg, &faulty_fds, &nullfds, &valid_to, EFAULT },
+	{ "Faulty exceptfds", 6, &preadfds_reg, &pwritefds_reg, &faulty_fds, &valid_to, EFAULT },
+	{ "Faulty timeout", 6, &preadfds_reg, &pwritefds_reg, &nullfds, &invalid_to, EFAULT },
+};
+
+static void run(unsigned int n)
+{
+	struct tcases *tc = &tests[n];
+
+	TEST(do_select_faulty_to(tc->nfds, *tc->readfds, *tc->writefds,
+				 *tc->exceptfds, *tc->timeout,
+				 tc->timeout == &invalid_to));
+
+	if (TST_RET != -1) {
+		tst_res(TFAIL, "%s: select() passed unexpectedly", tc->name);
+		return;
+	}
+
+	if (tc->exp_errno != TST_ERR) {
+		tst_res(TFAIL | TTERRNO, "%s: select()() should fail with %s",
+			tc->name, tst_strerrno(tc->exp_errno));
+		return;
+	}
+
+	tst_res(TPASS, "%s: select() failed as expected", tc->name);
+}
+
+static void setup(void)
+{
+	void *faulty_address;
+
+	select_info();
+
+	timeout.tv_sec = 0;
+	timeout.tv_usec = 100000;
+
+	/* Regular file */
+	fd_closed = SAFE_OPEN("tmpfile1", O_CREAT | O_RDWR, 0777);
+	FD_ZERO(&fds_closed);
+	FD_SET(fd_closed, &fds_closed);
+
+	SAFE_PIPE(fd);
+	FD_ZERO(&readfds_reg);
+	FD_ZERO(&writefds_reg);
+	FD_SET(fd[0], &readfds_reg);
+	FD_SET(fd[1], &writefds_reg);
+
+	SAFE_CLOSE(fd_closed);
+
+	faulty_address = tst_get_bad_addr(NULL);
+	invalid_to = faulty_address;
+	faulty_fds = faulty_address;
+}
+
+static struct tst_test test = {
+	.test = run,
+	.tcnt = ARRAY_SIZE(tests),
+	.test_variants = TEST_VARIANTS,
+	.setup = setup,
+	.needs_tmpdir = 1,
+};
diff --git a/testcases/kernel/syscalls/select/select_var.h b/testcases/kernel/syscalls/select/select_var.h
index 86f80eeb0dc1..c8a8eb64e06a 100644
--- a/testcases/kernel/syscalls/select/select_var.h
+++ b/testcases/kernel/syscalls/select/select_var.h
@@ -16,7 +16,8 @@ struct compat_sel_arg_struct {
 	long _tvp;
 };
 
-static int do_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)
+static int do_select_faulty_to(int nfds, fd_set *readfds, fd_set *writefds,
+		fd_set *exceptfds, struct timeval *timeout, int faulty_to)
 {
 	switch (tst_variant) {
 	case 0:
@@ -39,25 +40,43 @@ static int do_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *except
 	}
 	case 2: {
 		int ret;
-		struct __kernel_old_timespec ts = {
-			.tv_sec = timeout->tv_sec,
-			.tv_nsec = timeout->tv_usec * 1000,
-		};
-		ret = tst_syscall(__NR_pselect6, nfds, readfds, writefds, exceptfds, &ts, NULL);
-		timeout->tv_sec = ts.tv_sec;
-		timeout->tv_usec = ts.tv_nsec / 1000;
+		struct __kernel_old_timespec _ts;
+		void *ts;
+
+		if (faulty_to) {
+			ts = timeout;
+		} else {
+			ts = &_ts;
+			_ts.tv_sec = timeout->tv_sec;
+			_ts.tv_nsec = timeout->tv_usec * 1000;
+		}
+
+		ret = tst_syscall(__NR_pselect6, nfds, readfds, writefds, exceptfds, ts, NULL);
+		if (!faulty_to) {
+			timeout->tv_sec = _ts.tv_sec;
+			timeout->tv_usec = _ts.tv_nsec / 1000;
+		}
 		return ret;
 	}
 	case 3: {
 		int ret = 0;
 #if (__NR_pselect6_time64 != __LTP__NR_INVALID_SYSCALL)
-		struct __kernel_timespec ts = {
-			.tv_sec = timeout->tv_sec,
-			.tv_nsec = timeout->tv_usec * 1000,
-		};
-		ret = tst_syscall(__NR_pselect6_time64, nfds, readfds, writefds, exceptfds, &ts, NULL);
-		timeout->tv_sec = ts.tv_sec;
-		timeout->tv_usec = ts.tv_nsec / 1000;
+		struct __kernel_timespec _ts;
+		void *ts;
+
+		if (faulty_to) {
+			ts = timeout;
+		} else {
+			ts = &_ts;
+			_ts.tv_sec = timeout->tv_sec;
+			_ts.tv_nsec = timeout->tv_usec * 1000;
+		}
+
+		ret = tst_syscall(__NR_pselect6_time64, nfds, readfds, writefds, exceptfds, ts, NULL);
+		if (!faulty_to) {
+			timeout->tv_sec = _ts.tv_sec;
+			timeout->tv_usec = _ts.tv_nsec / 1000;
+		}
 #else
 		tst_brk(TCONF, "__NR_pselect6 time64 variant not supported");
 #endif
@@ -75,6 +94,12 @@ static int do_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *except
 	return -1;
 }
 
+static inline int do_select(int nfds, fd_set *readfds, fd_set *writefds,
+			    fd_set *exceptfds, struct timeval *timeout)
+{
+	return do_select_faulty_to(nfds, readfds, writefds, exceptfds, timeout, 0);
+}
+
 static void select_info(void)
 {
 	switch (tst_variant) {
-- 
2.25.0.rc1.19.g042ed3e048af


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [LTP] [PATCH V4 2/3] syscalls: select: Verify that data is available to read
  2020-10-21  4:32   ` [LTP] [PATCH V4 " Viresh Kumar
@ 2020-10-21 12:04     ` Cyril Hrubis
  2020-10-22  4:54       ` Viresh Kumar
  0 siblings, 1 reply; 17+ messages in thread
From: Cyril Hrubis @ 2020-10-21 12:04 UTC (permalink / raw)
  To: ltp

Hi!
> +	else if (!TST_RET)
> +		tst_res(TFAIL, "select() timed out %s", tc->desc);
> +	else if (TST_RET != exp_ret)
> +		tst_res(TFAIL, "select() returned incorrect value %s, expected: %d, got: %lu", tc->desc, exp_ret, TST_RET);
> +	else if (FD_ISSET(*tc->readfd, tc->readfds) && (!tc->writefd || FD_ISSET(*tc->writefd, tc->writefds)))
>  		tst_res(TPASS, "select() passed %s", tc->desc);
> +	else
> +		tst_res(TFAIL, "select() returned expected value %s, but all file descriptors aren't ready", tc->desc);

In the end I've rewritten this part to use returns in order to avoid
this if else maze with overly long lines and pushed, thanks.

I guess that we still need a test where select would clear the bits from
fd->set though, I supposes that the easiest solution would be to add
select04.c for that...

-- 
Cyril Hrubis
chrubis@suse.cz

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [LTP] [PATCH V2 4/4] syscalls: select: Add failure tests
  2020-10-21  5:32   ` [LTP] [PATCH V2 4/4] syscalls: select: Add failure tests Viresh Kumar
@ 2020-10-21 14:54     ` Cyril Hrubis
  0 siblings, 0 replies; 17+ messages in thread
From: Cyril Hrubis @ 2020-10-21 14:54 UTC (permalink / raw)
  To: ltp

Hi!
Pushed with cosmetic changes, thanks.

-- 
Cyril Hrubis
chrubis@suse.cz

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [LTP] [PATCH V4 2/3] syscalls: select: Verify that data is available to read
  2020-10-21 12:04     ` Cyril Hrubis
@ 2020-10-22  4:54       ` Viresh Kumar
  2020-10-22 10:13         ` Cyril Hrubis
  0 siblings, 1 reply; 17+ messages in thread
From: Viresh Kumar @ 2020-10-22  4:54 UTC (permalink / raw)
  To: ltp

On 21-10-20, 14:04, Cyril Hrubis wrote:
> I guess that we still need a test where select would clear the bits from
> fd->set though, I supposes that the easiest solution would be to add
> select04.c for that...

I am not sure how to do that and why would that matter ? :)

-- 
viresh

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [LTP] [PATCH V4 2/3] syscalls: select: Verify that data is available to read
  2020-10-22  4:54       ` Viresh Kumar
@ 2020-10-22 10:13         ` Cyril Hrubis
  0 siblings, 0 replies; 17+ messages in thread
From: Cyril Hrubis @ 2020-10-22 10:13 UTC (permalink / raw)
  To: ltp

Hi!
> > I guess that we still need a test where select would clear the bits from
> > fd->set though, I supposes that the easiest solution would be to add
> > select04.c for that...
> 
> I am not sure how to do that and why would that matter ? :)

So the tests we do have now are checking that the bits in the fdset are
not cleared when there are data ready to be read/written from/to the
filke descriptor, right?

What we need is a test where we ask for a data to be read from an empty
pipe, ask for data to be written to a pipe filled with data (write there
till we get EAGAIN in setup), etc. We can do this with a very short
timeout or even with a timeout set to zero (polling) and check that the
bits were cleared once we have returned from the call.

-- 
Cyril Hrubis
chrubis@suse.cz

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2020-10-22 10:13 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-08  9:44 [LTP] [PATCH V3 1/3] syscalls: select: Merge few tests and migrate to new format Viresh Kumar
2020-09-08  9:44 ` [LTP] [PATCH V3 2/3] syscalls: select: Verify that data is available to read Viresh Kumar
2020-10-14 12:13   ` Cyril Hrubis
2020-10-19 10:10     ` Viresh Kumar
2020-10-20 13:06       ` Cyril Hrubis
2020-10-21  4:32   ` [LTP] [PATCH V4 " Viresh Kumar
2020-10-21 12:04     ` Cyril Hrubis
2020-10-22  4:54       ` Viresh Kumar
2020-10-22 10:13         ` Cyril Hrubis
2020-09-08  9:44 ` [LTP] [PATCH V3 3/3] syscalls: select: Rename select04.c to select02.c Viresh Kumar
2020-10-14 12:15   ` Cyril Hrubis
2020-10-19 11:37     ` Viresh Kumar
2020-10-20 13:06       ` Cyril Hrubis
2020-10-21  5:32   ` [LTP] [PATCH V2 4/4] syscalls: select: Add failure tests Viresh Kumar
2020-10-21 14:54     ` Cyril Hrubis
2020-10-06  7:59 ` [LTP] [PATCH V3 1/3] syscalls: select: Merge few tests and migrate to new format Viresh Kumar
2020-10-14 12:05 ` Cyril Hrubis

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.