All of lore.kernel.org
 help / color / mirror / Atom feed
* [LTP] [COMMITTED] [PATCH] syscalls/waitid: Guarded buf + result assertions
@ 2022-02-21 15:59 Cyril Hrubis
  0 siblings, 0 replies; only message in thread
From: Cyril Hrubis @ 2022-02-21 15:59 UTC (permalink / raw)
  To: ltp

- make use of guarded buffers for the infop
- add assertion for the values reported in the infop
- Add a few more assertions for pid and gid filter tests

+ adjustements to the docparse comments

Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
---
 testcases/kernel/syscalls/waitid/waitid02.c | 17 +++++------
 testcases/kernel/syscalls/waitid/waitid03.c | 18 +++++------
 testcases/kernel/syscalls/waitid/waitid04.c | 19 +++++++-----
 testcases/kernel/syscalls/waitid/waitid05.c | 33 ++++++++++++++-------
 testcases/kernel/syscalls/waitid/waitid06.c | 28 +++++++++++------
 testcases/kernel/syscalls/waitid/waitid07.c | 22 ++++++++------
 testcases/kernel/syscalls/waitid/waitid08.c | 30 ++++++++++++-------
 testcases/kernel/syscalls/waitid/waitid09.c | 33 ++++++++-------------
 8 files changed, 115 insertions(+), 85 deletions(-)

diff --git a/testcases/kernel/syscalls/waitid/waitid02.c b/testcases/kernel/syscalls/waitid/waitid02.c
index 15b807476..f13a4ed00 100644
--- a/testcases/kernel/syscalls/waitid/waitid02.c
+++ b/testcases/kernel/syscalls/waitid/waitid02.c
@@ -8,24 +8,23 @@
 /*\
  * [Description]
  *
- * This test is checking if waitid() syscall returns EINVAL when passing
- * invalid set of input values.
+ * Tests if waitid() returns EINVAL when passed invalid options flag value.
  */
 
 #include <sys/wait.h>
 #include "tst_test.h"
 
+static siginfo_t *infop;
+
 static void run(void)
 {
-	siginfo_t infop;
-
-	memset(&infop, 0, sizeof(infop));
-	TST_EXP_FAIL(waitid(P_ALL, 0, &infop, WNOHANG), EINVAL);
-
-	tst_res(TINFO, "si_pid = %d ; si_code = %d ; si_status = %d",
-		infop.si_pid, infop.si_code, infop.si_status);
+	TST_EXP_FAIL(waitid(P_ALL, 0, infop, WNOHANG), EINVAL);
 }
 
 static struct tst_test test = {
 	.test_all = run,
+	.bufs = (struct tst_buffers[]) {
+		{&infop, .size = sizeof(*infop)},
+		{}
+	}
 };
diff --git a/testcases/kernel/syscalls/waitid/waitid03.c b/testcases/kernel/syscalls/waitid/waitid03.c
index 1dbb578da..ef3fd7376 100644
--- a/testcases/kernel/syscalls/waitid/waitid03.c
+++ b/testcases/kernel/syscalls/waitid/waitid03.c
@@ -8,24 +8,24 @@
 /*\
  * [Description]
  *
- * This test is checking if waitid() syscall returns ECHILD when the calling
- * process has no existing unwaited-for child processes.
+ * Tests if waitid() syscall returns ECHILD when the calling process has no
+ * child processes.
  */
 
 #include <sys/wait.h>
 #include "tst_test.h"
 
+static siginfo_t *infop;
+
 static void run(void)
 {
-	siginfo_t infop;
-
-	memset(&infop, 0, sizeof(infop));
-	TST_EXP_FAIL(waitid(P_ALL, 0, &infop, WNOHANG | WEXITED), ECHILD);
-
-	tst_res(TINFO, "si_pid = %d ; si_code = %d ; si_status = %d",
-		infop.si_pid, infop.si_code, infop.si_status);
+	TST_EXP_FAIL(waitid(P_ALL, 0, infop, WNOHANG | WEXITED), ECHILD);
 }
 
 static struct tst_test test = {
 	.test_all = run,
+	.bufs = (struct tst_buffers[]) {
+		{&infop, .size = sizeof(*infop)},
+		{}
+	}
 };
diff --git a/testcases/kernel/syscalls/waitid/waitid04.c b/testcases/kernel/syscalls/waitid/waitid04.c
index 32c652dba..96c1cf8b1 100644
--- a/testcases/kernel/syscalls/waitid/waitid04.c
+++ b/testcases/kernel/syscalls/waitid/waitid04.c
@@ -8,15 +8,17 @@
 /*\
  * [Description]
  *
- * This test is checking if waitid() syscall filters a child in WNOHANG status.
+ * This test if waitid() syscall leaves the si_pid set to 0 with WNOHANG flag
+ * when no child was waited for.
  */
 
 #include <sys/wait.h>
 #include "tst_test.h"
 
+static siginfo_t *infop;
+
 static void run(void)
 {
-	siginfo_t infop;
 	pid_t pid_child;
 
 	pid_child = SAFE_FORK();
@@ -25,13 +27,10 @@ static void run(void)
 		return;
 	}
 
-	tst_res(TINFO, "filter all children by WNOHANG | WEXITED");
-
-	memset(&infop, 0, sizeof(infop));
-	TST_EXP_PASS(waitid(P_ALL, pid_child, &infop, WNOHANG | WEXITED));
+	memset(infop, 0, sizeof(*infop));
+	TST_EXP_PASS(waitid(P_ALL, pid_child, infop, WNOHANG | WEXITED));
 
-	tst_res(TINFO, "si_pid = %d ; si_code = %d ; si_status = %d",
-		infop.si_pid, infop.si_code, infop.si_status);
+	TST_EXP_EQ_LI(infop->si_pid, 0);
 
 	TST_CHECKPOINT_WAKE(0);
 }
@@ -40,4 +39,8 @@ static struct tst_test test = {
 	.test_all = run,
 	.forks_child = 1,
 	.needs_checkpoints = 1,
+	.bufs = (struct tst_buffers[]) {
+		{&infop, .size = sizeof(*infop)},
+		{}
+	}
 };
diff --git a/testcases/kernel/syscalls/waitid/waitid05.c b/testcases/kernel/syscalls/waitid/waitid05.c
index 3c0a80cc1..1b9186dc1 100644
--- a/testcases/kernel/syscalls/waitid/waitid05.c
+++ b/testcases/kernel/syscalls/waitid/waitid05.c
@@ -8,34 +8,45 @@
 /*\
  * [Description]
  *
- * This test is checking if waitid() syscall filters children which exited from
- * the same group ID.
+ * Tests if waitid() filters children correctly by the group ID.
+ *
+ * - waitid() with GID + 1 returns ECHILD
+ * - waitid() with GID returns correct data
  */
 
+#include <stdlib.h>
 #include <sys/wait.h>
 #include "tst_test.h"
 
+static siginfo_t *infop;
+
 static void run(void)
 {
-	siginfo_t infop;
 	pid_t pid_group;
+	pid_t pid_child;
 
-	/* dummy fork to spawn child in the same group ID */
-	if (!SAFE_FORK())
-		return;
+	pid_child = SAFE_FORK();
+	if (!pid_child)
+		exit(0);
 
 	pid_group = getpgid(0);
 
-	tst_res(TINFO, "filter child by group ID and WEXITED");
+	TST_EXP_FAIL(waitid(P_PGID, pid_group+1, infop, WEXITED), ECHILD);
 
-	memset(&infop, 0, sizeof(infop));
-	TST_EXP_PASS(waitid(P_PGID, pid_group, &infop, WEXITED));
+	memset(infop, 0, sizeof(*infop));
+	TST_EXP_PASS(waitid(P_PGID, pid_group, infop, WEXITED));
 
-	tst_res(TINFO, "si_pid = %d ; si_code = %d ; si_status = %d",
-		infop.si_pid, infop.si_code, infop.si_status);
+	TST_EXP_EQ_LI(infop->si_pid, pid_child);
+	TST_EXP_EQ_LI(infop->si_status, 0);
+	TST_EXP_EQ_LI(infop->si_signo, SIGCHLD);
+	TST_EXP_EQ_LI(infop->si_code, CLD_EXITED);
 }
 
 static struct tst_test test = {
 	.test_all = run,
 	.forks_child = 1,
+	.bufs = (struct tst_buffers[]) {
+		{&infop, .size = sizeof(*infop)},
+		{}
+	}
 };
diff --git a/testcases/kernel/syscalls/waitid/waitid06.c b/testcases/kernel/syscalls/waitid/waitid06.c
index 886c9b2fd..5f51c81c8 100644
--- a/testcases/kernel/syscalls/waitid/waitid06.c
+++ b/testcases/kernel/syscalls/waitid/waitid06.c
@@ -8,32 +8,42 @@
 /*\
  * [Description]
  *
- * This test is checking if waitid() syscall filters children which exited.
+ * Tests if waitid() filters children correctly by the PID.
+ *
+ * - waitid() with PID + 1 returns ECHILD
+ * - waitid() with PID returns correct data
  */
 
+#include <stdlib.h>
 #include <sys/wait.h>
 #include "tst_test.h"
 
+static siginfo_t *infop;
+
 static void run(void)
 {
-	siginfo_t infop;
 	pid_t pid_child;
 
-	/* dummy fork */
 	pid_child = SAFE_FORK();
 	if (!pid_child)
-		return;
+		exit(0);
 
-	tst_res(TINFO, "filter child by WEXITED");
+	TST_EXP_FAIL(waitid(P_PID, pid_child+1, infop, WEXITED), ECHILD);
 
-	memset(&infop, 0, sizeof(infop));
-	TST_EXP_PASS(waitid(P_PID, pid_child, &infop, WEXITED));
+	memset(infop, 0, sizeof(*infop));
+	TST_EXP_PASS(waitid(P_PID, pid_child, infop, WEXITED));
 
-	tst_res(TINFO, "si_pid = %d ; si_code = %d ; si_status = %d",
-		infop.si_pid, infop.si_code, infop.si_status);
+	TST_EXP_EQ_LI(infop->si_pid, pid_child);
+	TST_EXP_EQ_LI(infop->si_status, 0);
+	TST_EXP_EQ_LI(infop->si_signo, SIGCHLD);
+	TST_EXP_EQ_LI(infop->si_code, CLD_EXITED);
 }
 
 static struct tst_test test = {
 	.test_all = run,
 	.forks_child = 1,
+	.bufs = (struct tst_buffers[]) {
+		{&infop, .size = sizeof(*infop)},
+		{}
+	}
 };
diff --git a/testcases/kernel/syscalls/waitid/waitid07.c b/testcases/kernel/syscalls/waitid/waitid07.c
index 23ae24f35..d607dbd8f 100644
--- a/testcases/kernel/syscalls/waitid/waitid07.c
+++ b/testcases/kernel/syscalls/waitid/waitid07.c
@@ -8,16 +8,16 @@
 /*\
  * [Description]
  *
- * This test is checking if waitid() syscall filters children killed with
- * SIGSTOP.
+ * Test if waitid() filters children killed with SIGSTOP.
  */
 
 #include <sys/wait.h>
 #include "tst_test.h"
 
+static siginfo_t *infop;
+
 static void run(void)
 {
-	siginfo_t infop;
 	pid_t pid_child;
 
 	pid_child = SAFE_FORK();
@@ -27,13 +27,13 @@ static void run(void)
 		return;
 	}
 
-	tst_res(TINFO, "filter child by WSTOPPED | WNOWAIT");
-
-	memset(&infop, 0, sizeof(infop));
-	TST_EXP_PASS(waitid(P_PID, pid_child, &infop, WSTOPPED | WNOWAIT));
+	memset(infop, 0, sizeof(*infop));
+	TST_EXP_PASS(waitid(P_PID, pid_child, infop, WSTOPPED | WNOWAIT));
 
-	tst_res(TINFO, "si_pid = %d ; si_code = %d ; si_status = %d",
-		infop.si_pid, infop.si_code, infop.si_status);
+	TST_EXP_EQ_LI(infop->si_pid, pid_child);
+	TST_EXP_EQ_LI(infop->si_status, SIGSTOP);
+	TST_EXP_EQ_LI(infop->si_signo, SIGCHLD);
+	TST_EXP_EQ_LI(infop->si_code, CLD_STOPPED);
 
 	SAFE_KILL(pid_child, SIGCONT);
 
@@ -44,4 +44,8 @@ static struct tst_test test = {
 	.test_all = run,
 	.forks_child = 1,
 	.needs_checkpoints = 1,
+	.bufs = (struct tst_buffers[]) {
+		{&infop, .size = sizeof(*infop)},
+		{}
+	}
 };
diff --git a/testcases/kernel/syscalls/waitid/waitid08.c b/testcases/kernel/syscalls/waitid/waitid08.c
index 86a134d99..2da680e64 100644
--- a/testcases/kernel/syscalls/waitid/waitid08.c
+++ b/testcases/kernel/syscalls/waitid/waitid08.c
@@ -8,16 +8,16 @@
 /*\
  * [Description]
  *
- * This test is checking if waitid() syscall filters children killed with
- * SIGCONT.
+ * Test if waitid() filters children killed with SIGCONT.
  */
 
 #include <sys/wait.h>
 #include "tst_test.h"
 
+static siginfo_t *infop;
+
 static void run(void)
 {
-	siginfo_t infop;
 	pid_t pid_child;
 
 	pid_child = SAFE_FORK();
@@ -29,19 +29,25 @@ static void run(void)
 
 	tst_res(TINFO, "send SIGCONT to child");
 
-	memset(&infop, 0, sizeof(infop));
-	TST_EXP_PASS(waitid(P_PID, pid_child, &infop, WSTOPPED));
+	memset(infop, 0, sizeof(*infop));
+	TST_EXP_PASS(waitid(P_PID, pid_child, infop, WSTOPPED));
+
+	TST_EXP_EQ_LI(infop->si_pid, pid_child);
+	TST_EXP_EQ_LI(infop->si_status, SIGSTOP);
+	TST_EXP_EQ_LI(infop->si_signo, SIGCHLD);
+	TST_EXP_EQ_LI(infop->si_code, CLD_STOPPED);
 
 	SAFE_KILL(pid_child, SIGCONT);
 
 	tst_res(TINFO, "filter child by WCONTINUED");
 
-	TST_EXP_PASS(waitid(P_PID, pid_child, &infop, WCONTINUED));
+	memset(infop, 0, sizeof(*infop));
+	TST_EXP_PASS(waitid(P_PID, pid_child, infop, WCONTINUED));
 
-	tst_res(TINFO, "si_pid = %d ; si_code = %d ; si_status = %d",
-		infop.si_pid, infop.si_code, infop.si_status);
-
-	SAFE_KILL(pid_child, SIGCONT);
+	TST_EXP_EQ_LI(infop->si_pid, pid_child);
+	TST_EXP_EQ_LI(infop->si_status, SIGCONT);
+	TST_EXP_EQ_LI(infop->si_signo, SIGCHLD);
+	TST_EXP_EQ_LI(infop->si_code, CLD_CONTINUED);
 
 	TST_CHECKPOINT_WAKE(0);
 }
@@ -50,4 +56,8 @@ static struct tst_test test = {
 	.test_all = run,
 	.forks_child = 1,
 	.needs_checkpoints = 1,
+	.bufs = (struct tst_buffers[]) {
+		{&infop, .size = sizeof(*infop)},
+		{}
+	}
 };
diff --git a/testcases/kernel/syscalls/waitid/waitid09.c b/testcases/kernel/syscalls/waitid/waitid09.c
index 3ee443831..115c2e672 100644
--- a/testcases/kernel/syscalls/waitid/waitid09.c
+++ b/testcases/kernel/syscalls/waitid/waitid09.c
@@ -8,37 +8,30 @@
 /*\
  * [Description]
  *
- * This test is checking that waitid() syscall filters not a child of the
- * current process.
+ * Test that waitid() fails with ECHILD with process that is not child of the
+ * current process. We fork() one child just to be sure that there are unwaited
+ * for children available while the test runs.
  */
 
+#include <stdlib.h>
 #include <sys/wait.h>
 #include "tst_test.h"
 
+static siginfo_t *infop;
+
 static void run(void)
 {
-	siginfo_t infop;
-	pid_t pid_child;
-
-	pid_child = SAFE_FORK();
-	if (!pid_child) {
-		TST_CHECKPOINT_WAIT(0);
-		return;
-	}
-
-	tst_res(TINFO, "filter not a child of the current process by WEXITED");
+	if (!SAFE_FORK())
+		exit(0);
 
-	memset(&infop, 0, sizeof(infop));
-	TST_EXP_FAIL(waitid(P_PID, 1, &infop, WEXITED), ECHILD);
-
-	tst_res(TINFO, "si_pid = %d ; si_code = %d ; si_status = %d",
-		infop.si_pid, infop.si_code, infop.si_status);
-
-	TST_CHECKPOINT_WAKE(0);
+	TST_EXP_FAIL(waitid(P_PID, 1, infop, WEXITED), ECHILD);
 }
 
 static struct tst_test test = {
 	.test_all = run,
 	.forks_child = 1,
-	.needs_checkpoints = 1,
+	.bufs = (struct tst_buffers[]) {
+		{&infop, .size = sizeof(*infop)},
+		{}
+	}
 };
-- 
2.34.1


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2022-02-21 15:57 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-21 15:59 [LTP] [COMMITTED] [PATCH] syscalls/waitid: Guarded buf + result assertions 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.