[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20221222035134.3467659-6-ammar.faizi@intel.com>
Date: Thu, 22 Dec 2022 10:51:31 +0700
From: Ammar Faizi <ammarfaizi2@...weeb.org>
To: Willy Tarreau <w@....eu>, Shuah Khan <shuah@...nel.org>,
"Paul E. McKenney" <paulmck@...nel.org>
Cc: Ammar Faizi <ammarfaizi2@...weeb.org>,
Gilang Fachrezy <gilang4321@...il.com>,
VNLX Kernel Department <kernel@...x.org>,
Alviro Iskandar Setiawan <alviro.iskandar@...weeb.org>,
Kanna Scarlet <knscarlet@...weeb.org>,
Muhammad Rizki <kiizuha@...weeb.org>,
GNU/Weeb Mailing List <gwml@...r.gnuweeb.org>,
Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
Linux Kselftest Mailing List
<linux-kselftest@...r.kernel.org>
Subject: [RFC PATCH v1 5/8] selftests/nolibc: Add `fork(2)` selftest
From: Ammar Faizi <ammarfaizi2@...weeb.org>
Ensure the fork() function can create a child process. Also, when the
child exits, the parent must be able to get the child's exit code
via waitpid().
Signed-off-by: Ammar Faizi <ammarfaizi2@...weeb.org>
---
tools/testing/selftests/nolibc/nolibc-test.c | 45 ++++++++++++++++++++
1 file changed, 45 insertions(+)
diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/selftests/nolibc/nolibc-test.c
index 8d69f8a0f35a..309cabbddeec 100644
--- a/tools/testing/selftests/nolibc/nolibc-test.c
+++ b/tools/testing/selftests/nolibc/nolibc-test.c
@@ -442,6 +442,50 @@ int test_getdents64(const char *dir)
return ret;
}
+/*
+ * Test fork().
+ * Make sure the exit code can be read from the parent process.
+ */
+static int test_fork_and_exit(int expected_code)
+{
+ int status;
+ int code;
+ pid_t ret;
+ pid_t p;
+
+ p = fork();
+ if (p < 0)
+ return p;
+
+ if (!p)
+ exit(expected_code);
+
+ do {
+ ret = waitpid(p, &status, 0);
+ if (ret < 0)
+ return ret;
+ } while (!WIFEXITED(status));
+
+ code = WEXITSTATUS(status);
+ if (code != expected_code) {
+ printf("test_fork_and_exit(): waitpid(): Invalid exit code: %d; expected = %d\n", code, expected_code);
+ return -1;
+ }
+
+ return 0;
+}
+
+static int test_fork(void)
+{
+ int i;
+
+ for (i = 0; i < 255; i++) {
+ if (test_fork_and_exit(i))
+ return -1;
+ }
+ return 0;
+}
+
/* Run syscall tests between IDs <min> and <max>.
* Return 0 on success, non-zero on failure.
*/
@@ -494,6 +538,7 @@ int run_syscall(int min, int max)
CASE_TEST(dup3_0); tmp = dup3(0, 100, 0); EXPECT_SYSNE(1, tmp, -1); close(tmp); break;
CASE_TEST(dup3_m1); tmp = dup3(-1, 100, 0); EXPECT_SYSER(1, tmp, -1, EBADF); if (tmp != -1) close(tmp); break;
CASE_TEST(execve_root); EXPECT_SYSER(1, execve("/", (char*[]){ [0] = "/", [1] = NULL }, NULL), -1, EACCES); break;
+ CASE_TEST(fork); EXPECT_SYSZR(1, test_fork()); break;
CASE_TEST(getdents64_root); EXPECT_SYSNE(1, test_getdents64("/"), -1); break;
CASE_TEST(getdents64_null); EXPECT_SYSER(1, test_getdents64("/dev/null"), -1, ENOTDIR); break;
CASE_TEST(gettimeofday_null); EXPECT_SYSZR(1, gettimeofday(NULL, NULL)); break;
--
Ammar Faizi
Powered by blists - more mailing lists