* [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.