null-argv.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /* Test that empty argvs are swapped out for a single empty string. */
  3. #include <stdio.h>
  4. #include <unistd.h>
  5. #include <sys/types.h>
  6. #include <sys/wait.h>
  7. #include "kselftest.h"
  8. #define FORK(exec) \
  9. do { \
  10. pid = fork(); \
  11. if (pid == 0) { \
  12. /* Child */ \
  13. exec; /* Some kind of exec */ \
  14. perror("# " #exec); \
  15. return 1; \
  16. } \
  17. check_result(pid, #exec); \
  18. } while (0)
  19. void check_result(pid_t pid, const char *msg)
  20. {
  21. int wstatus;
  22. if (pid == (pid_t)-1) {
  23. perror("# fork");
  24. ksft_test_result_fail("fork failed: %s\n", msg);
  25. return;
  26. }
  27. if (waitpid(pid, &wstatus, 0) < 0) {
  28. perror("# waitpid");
  29. ksft_test_result_fail("waitpid failed: %s\n", msg);
  30. return;
  31. }
  32. if (!WIFEXITED(wstatus)) {
  33. ksft_test_result_fail("child did not exit: %s\n", msg);
  34. return;
  35. }
  36. if (WEXITSTATUS(wstatus) != 0) {
  37. ksft_test_result_fail("non-zero exit: %s\n", msg);
  38. return;
  39. }
  40. ksft_test_result_pass("%s\n", msg);
  41. }
  42. int main(int argc, char *argv[], char *envp[])
  43. {
  44. pid_t pid;
  45. static char * const args[] = { NULL };
  46. static char * const str[] = { "", NULL };
  47. /* argc counting checks */
  48. if (argc < 1) {
  49. fprintf(stderr, "# FAIL: saw argc == 0 (old kernel?)\n");
  50. return 1;
  51. }
  52. if (argc != 1) {
  53. fprintf(stderr, "# FAIL: unknown argc (%d)\n", argc);
  54. return 1;
  55. }
  56. if (argv[0][0] == '\0') {
  57. /* Good, we found a NULL terminated string at argv[0]! */
  58. return 0;
  59. }
  60. /* Test runner. */
  61. ksft_print_header();
  62. ksft_set_plan(5);
  63. FORK(execve(argv[0], str, NULL));
  64. FORK(execve(argv[0], NULL, NULL));
  65. FORK(execve(argv[0], NULL, envp));
  66. FORK(execve(argv[0], args, NULL));
  67. FORK(execve(argv[0], args, envp));
  68. ksft_exit(ksft_cnt.ksft_pass == ksft_plan);
  69. }