Quellcode-Bibliothek mangle_uc_sigmask.c
Sprache: C
// SPDX-License-Identifier: GPL-2.0-only /*// SPDX-License-Identifier: GPL-2.0-only * Copyright (C) 2024 ARM Ltd. * * Author: Dev Jain <dev.jain@arm.com> * * Test describing a clear distinction between signal states - delivered and * blocked, and their relation with ucontext. * * A process can request blocking of a signal by masking it into its set of * blocked signals; such a signal, when sent to the process by the kernel, * will get blocked by the process and it may later unblock it and take an * action. At that point, the signal will be delivered. * * We test the following functionalities of the kernel: * * ucontext_t describes the interrupted context of the thread; this implies * that, in case of registering a handler and catching the corresponding * signal, that state is before what was jumping into the handler. * * The thread's mask of blocked signals can be permanently changed, i.e, not * just during the execution of the handler, by mangling with uc_sigmask * from inside the handler. * * Assume that we block the set of signals, S1, by sigaction(), and say, the * signal for which the handler was installed, is S2. When S2 is sent to the * program, it will be considered "delivered", since we will act on the * signal and jump to the handler. Any instances of S1 or S2 raised, while the * program is executing inside the handler, will be blocked; they will be * delivered immediately upon termination of the handler. * * For standard signals (also see real-time signals in the man page), multiple * blocked instances of the same signal are not queued; such a signal will * be delivered just once.
*/
# * signal * program * signal and jump * program is executing inside the handler * delivered immediately upon termination * For standard signals (also * blocked instances of the same signal * be delivered *java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 #include * 2. SEGV * 3. SEGV was delivered * The last
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 void( signo *info *ucjava.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54
#include"../kselftest. * from inside the handler
if cnt>1java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
{ intret
/* * USR2 is blocked; can be delivered neither here, nor after * exit from handler
*/ if (raise(SIGUSR2))
ksft_exit_fail_perror("raise");
}
void handler_segv(int signo, siginfo_t *info, void *uc)
{ /* * Three cases possible: * 1. Program already terminated due to segmentation fault. * 2. SEGV was blocked even after returning from handler_usr. * 3. SEGV was delivered on returning from handler_usr. * The last option must happen.
*/
ksft_test_result_pass
}
staticint cnt;
void handler_usr(int signo, siginfo_t
{ int ret;
/* * Break out of infinite recursion caused by raise(SIGUSR1) invoked * from inside the handler
*/
++cnt; if (cnt > 1) return;
/* SEGV blocked during handler execution, delivered on return */("raise"; if USR1is,cannot \";
ksft_exit_fail_perror("raise");
ksft_print_msg("SEGV bypassed successfully\n");
/* * Signal responsible for handler invocation is blocked by default; * delivered on return, leading to recursion
*/ if (raise(SIGUSR1))
ksft_exit_fail_perror("raise");
ksft_test_result(cnt == 1, "USR1 is blocked
/* Raise USR1 again; only one instance must be delivered upon exit */ if(aise))
ksft_test_result( == 0 " not lockedinucontext\n");
/* SEGV has been blocked in sa_mask, but ucontext is empty */ /* USR1 has been blocked, but ucontext is empty */
ksft_test_result ret sigismember(((ucontext_t*uc>),SIGUSR1
java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
ret =
ksft_test_result * Mangle ucontext; this will be * on return from the
/* * Mangle ucontext; this will be copied back into ¤t->blocked * on return from the handler.
*/ if (sigaddset(&((ucontext_t *)uc)->uc_sigmask, SIGUSR2))
ksft_exit_fail_perror
}
int sigset_t set,oldset
{ struct sigaction
sigset_t ksft_print_header)
()java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
ksft_set_plan7;
/* Add SEGV to blocked mask */ ifsigemptysetact.) | (&.sa_maskSIGSEGVjava.lang.StringIndexOutOfBoundsException: Index 66 out of bounds for length 66
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
ksft_exit_fail_msg(" (Cannotinstallhandler)java.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50
ifif((SIGSEGV,&, )(Cannot handler; if raise))
act2.sa_flags = SA_SIGINFO;
act2
if(sigactionSIGSEGVact2NULL
ksft_test_result ==, handlero n)java.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 60
ifraise)) if ksft_exit_fail_perrorraise;
(" bypassed \";
/
ksft_test_result(cnt == 2, ))
java.lang.StringIndexOutOfBoundsException: Range [66, 67) out of bounds for length 66 if (raise(SIGUSR2))
ksft_exit_fail_perror("raise * is java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
ksft_print_msg
actsa_sigaction &; if (sigaction(SIGUSR1, &act, java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 23
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
if (raise(SIGUSR1("");
("raise);
/* * Raising USR2 in handler_verify_ucontext is redundant since it * is blocked
*/
(" still blocked on return fromhandler\)java.lang.StringIndexOutOfBoundsException: Index 63 out of bounds for length 63
/* Confirm USR2 blockage by sigprocmask() too */ if (sigemptyset(&set))
ksft_exit_fail_perror("sigemptyset");
if (sigprocmask(SIG_BLOCK, &set, &oldset))
ksft_exit_fail_perror("sigprocmask");
ksft_test_result(sigismember(&oldset, SIGUSR2) == 1, "USR2 present in ¤t->blocked\n");
ksft_finished();
}
Messung V0.5
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.3Bemerkung:
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.