1 // SPDX-License-Identifier: GPL-2.0-only
2 /* Test that empty argvs are swapped out for a single empty string. */
8 #include "../kselftest.h"
15 exec; /* Some kind of exec */ \
19 check_result(pid, #exec); \
22 void check_result(pid_t pid, const char *msg)
26 if (pid == (pid_t)-1) {
28 ksft_test_result_fail("fork failed: %s\n", msg);
31 if (waitpid(pid, &wstatus, 0) < 0) {
33 ksft_test_result_fail("waitpid failed: %s\n", msg);
36 if (!WIFEXITED(wstatus)) {
37 ksft_test_result_fail("child did not exit: %s\n", msg);
40 if (WEXITSTATUS(wstatus) != 0) {
41 ksft_test_result_fail("non-zero exit: %s\n", msg);
44 ksft_test_result_pass("%s\n", msg);
47 int main(int argc, char *argv[], char *envp[])
50 static char * const args[] = { NULL };
51 static char * const str[] = { "", NULL };
53 /* argc counting checks */
55 fprintf(stderr, "# FAIL: saw argc == 0 (old kernel?)\n");
59 fprintf(stderr, "# FAIL: unknown argc (%d)\n", argc);
62 if (argv[0][0] == '\0') {
63 /* Good, we found a NULL terminated string at argv[0]! */
71 FORK(execve(argv[0], str, NULL));
72 FORK(execve(argv[0], NULL, NULL));
73 FORK(execve(argv[0], NULL, envp));
74 FORK(execve(argv[0], args, NULL));
75 FORK(execve(argv[0], args, envp));
77 ksft_exit(ksft_cnt.ksft_pass == ksft_plan);