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