[LTP] [COMMITTED] [PATCH] syscalls/waitid: Guarded buf + result assertions

Cyril Hrubis chrubis@suse.cz
Mon Feb 21 16:59:33 CET 2022


- 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



More information about the ltp mailing list