Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /* Test that empty argvs are swapped out for a single empty string. */
0003 #include <stdio.h>
0004 #include <unistd.h>
0005 #include <sys/types.h>
0006 #include <sys/wait.h>
0007 
0008 #include "../kselftest.h"
0009 
0010 #define FORK(exec)              \
0011 do {                        \
0012     pid = fork();               \
0013     if (pid == 0) {             \
0014         /* Child */         \
0015         exec; /* Some kind of exec */   \
0016         perror("# " #exec);     \
0017         return 1;           \
0018     }                   \
0019     check_result(pid, #exec);       \
0020 } while (0)
0021 
0022 void check_result(pid_t pid, const char *msg)
0023 {
0024     int wstatus;
0025 
0026     if (pid == (pid_t)-1) {
0027         perror("# fork");
0028         ksft_test_result_fail("fork failed: %s\n", msg);
0029         return;
0030     }
0031     if (waitpid(pid, &wstatus, 0) < 0) {
0032         perror("# waitpid");
0033         ksft_test_result_fail("waitpid failed: %s\n", msg);
0034         return;
0035     }
0036     if (!WIFEXITED(wstatus)) {
0037         ksft_test_result_fail("child did not exit: %s\n", msg);
0038         return;
0039     }
0040     if (WEXITSTATUS(wstatus) != 0) {
0041         ksft_test_result_fail("non-zero exit: %s\n", msg);
0042         return;
0043     }
0044     ksft_test_result_pass("%s\n", msg);
0045 }
0046 
0047 int main(int argc, char *argv[], char *envp[])
0048 {
0049     pid_t pid;
0050     static char * const args[] = { NULL };
0051     static char * const str[] = { "", NULL };
0052 
0053     /* argc counting checks */
0054     if (argc < 1) {
0055         fprintf(stderr, "# FAIL: saw argc == 0 (old kernel?)\n");
0056         return 1;
0057     }
0058     if (argc != 1) {
0059         fprintf(stderr, "# FAIL: unknown argc (%d)\n", argc);
0060         return 1;
0061     }
0062     if (argv[0][0] == '\0') {
0063         /* Good, we found a NULL terminated string at argv[0]! */
0064         return 0;
0065     }
0066 
0067     /* Test runner. */
0068     ksft_print_header();
0069     ksft_set_plan(5);
0070 
0071     FORK(execve(argv[0], str, NULL));
0072     FORK(execve(argv[0], NULL, NULL));
0073     FORK(execve(argv[0], NULL, envp));
0074     FORK(execve(argv[0], args, NULL));
0075     FORK(execve(argv[0], args, envp));
0076 
0077     ksft_exit(ksft_cnt.ksft_pass == ksft_plan);
0078 }