Path: blob/master/tools/testing/selftests/clone3/clone3_clear_sighand.c
26285 views
/* SPDX-License-Identifier: GPL-2.0 */12#define _GNU_SOURCE3#include <errno.h>4#include <sched.h>5#include <signal.h>6#include <stdio.h>7#include <stdlib.h>8#include <string.h>9#include <unistd.h>10#include <linux/sched.h>11#include <linux/types.h>12#include <sys/syscall.h>13#include <sys/wait.h>1415#include "../kselftest.h"16#include "clone3_selftests.h"1718static void nop_handler(int signo)19{20}2122static int wait_for_pid(pid_t pid)23{24int status, ret;2526again:27ret = waitpid(pid, &status, 0);28if (ret == -1) {29if (errno == EINTR)30goto again;3132return -1;33}3435if (!WIFEXITED(status))36return -1;3738return WEXITSTATUS(status);39}4041static void test_clone3_clear_sighand(void)42{43int ret;44pid_t pid;45struct __clone_args args = {};46struct sigaction act;4748/*49* Check that CLONE_CLEAR_SIGHAND and CLONE_SIGHAND are mutually50* exclusive.51*/52args.flags |= CLONE_CLEAR_SIGHAND | CLONE_SIGHAND;53args.exit_signal = SIGCHLD;54pid = sys_clone3(&args, sizeof(args));55if (pid > 0)56ksft_exit_fail_msg(57"clone3(CLONE_CLEAR_SIGHAND | CLONE_SIGHAND) succeeded\n");5859act.sa_handler = nop_handler;60ret = sigemptyset(&act.sa_mask);61if (ret < 0)62ksft_exit_fail_msg("%s - sigemptyset() failed\n",63strerror(errno));6465act.sa_flags = 0;6667/* Register signal handler for SIGUSR1 */68ret = sigaction(SIGUSR1, &act, NULL);69if (ret < 0)70ksft_exit_fail_msg(71"%s - sigaction(SIGUSR1, &act, NULL) failed\n",72strerror(errno));7374/* Register signal handler for SIGUSR2 */75ret = sigaction(SIGUSR2, &act, NULL);76if (ret < 0)77ksft_exit_fail_msg(78"%s - sigaction(SIGUSR2, &act, NULL) failed\n",79strerror(errno));8081/* Check that CLONE_CLEAR_SIGHAND works. */82args.flags = CLONE_CLEAR_SIGHAND;83pid = sys_clone3(&args, sizeof(args));84if (pid < 0)85ksft_exit_fail_msg("%s - clone3(CLONE_CLEAR_SIGHAND) failed\n",86strerror(errno));8788if (pid == 0) {89ret = sigaction(SIGUSR1, NULL, &act);90if (ret < 0)91exit(EXIT_FAILURE);9293if (act.sa_handler != SIG_DFL)94exit(EXIT_FAILURE);9596ret = sigaction(SIGUSR2, NULL, &act);97if (ret < 0)98exit(EXIT_FAILURE);99100if (act.sa_handler != SIG_DFL)101exit(EXIT_FAILURE);102103exit(EXIT_SUCCESS);104}105106ret = wait_for_pid(pid);107if (ret)108ksft_exit_fail_msg(109"Failed to clear signal handler for child process\n");110111ksft_test_result_pass("Cleared signal handlers for child process\n");112}113114int main(int argc, char **argv)115{116ksft_print_header();117ksft_set_plan(1);118test_clone3_supported();119120test_clone3_clear_sighand();121122ksft_exit_pass();123}124125126