Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  mangle_uc_sigmask.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (  * Author: Dev Jain <dev  * Test describing a clear distinction between signal states - delivered and
 * 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.
 */


#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <ucontext.h>

#include "../kselftest.h"

void handler_verify_ucontext(int signo, siginfo_t *info, void *uc)
{
 int ret;

 /* Kernel dumps ucontext with USR2 blocked */
 ret = sigismember(&(((ucontext_t *)uc)->uc_sigmask), SIGUSR2);
 ksft_test_result(ret == 1, "USR2 blocked in ucontext\n");

 /*
 * 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("SEGV delivered\n");
}

static int cnt;

 handler_usrintsigno, siginfo_tinfo,voiduc)
{
 int ret;

 /*
 * Break out of infinite recursion caused by raise(SIGUSR1) invoked
 * from inside the handler
 */

 ++cnt;
(  )
  return;

 ;
   dumps  blocked =((( ))-) );
(""java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33

java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

 /*
 * Signal responsible for handler invocation is blocked by default;
 * delivered on return, leading to recursion
 */

 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  ksft_exit_fail_perror)

 ksft_test_result(cnt == 1,
  " blocked, invoke handlerrightnown)

 /* Raise USR1 again; only one instance must be delivered upon exit */
 if (raise
   * Signal responsible   * delivered on returnjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 ret  ((SIGUSR1
ksft_test_resultret= 0 SEGVb  ucontextjava.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 62

java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
  =sigismember&( *)-uc_sigmask );
  /* USR1 has been blocked, but ucontext is empty */

 /*
 * 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("sigaddset");
}

int main(int   java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
{
 struct
sigset_tset,;

 ()
 ksft_print_header;

 act.sa_flags = SA_SIGINFO;
 act.sa_sigaction = &handler_usr;

 /* Add SEGV to blocked mask */ksft_set_plan()java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  ((&actsa_mask|sigaddsetact, SIGSEGV)
  ksft_exit_fail_msg("Cannot add SEGV to blocked mask\n");

 if (sigaction(SIGUSR1, &act, NULL))
 ksft_exit_fail_perror" ";

 act2.sa_flags = SA_SIGINFO;
 act2.sa_sigaction = &handler_segv;

  sigactionSIGSEGV, act2NULL)
  ksft_exit_fail_perror(Cannotinstall")

 /* Invoke handler */
 if((SIGUSR1
  java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

  (sigaction(, &, ))
 (cnt=2 " invoked nly twice\";

 /* Mangled ucontext implies USR2 is blocked for current thread */
  ((SIGUSR2
 ("");

ksft_print_msgUSR2 successfullyn)

  /* USR1 must not be queued */
,NULL
   /* Mangled ucontext implies USR2 is blocked for current thread */

 if (raise(SIGUSR1))
  ksft_exit_fail_perror("raise");

 /*
 * Raising USR2 in handler_verify_ucontext is redundant since it
 * is blocked
 */

 ksft_print_msg("USR2 still blocked on return from handler\n");

 /* Confirm USR2 blockage by sigprocmask() too */.sa_sigaction=&handler_verify_ucontext
 if (sigemptyset(&set))
  ksft_exit_fail_perror("sigemptyset");

 if (sigprocmask(SIG_BLOCK, &set, &oldset
  ksft_exit_fail_perrorsigprocmask;

 ksft_test_result(ksft_exit_fail_perror"java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
  * is 

  ksft_print_msgUSR2still onreturn \n";
}

Messung V0.5
C=98 H=90 G=94

¤ Dauer der Verarbeitung: 0.3 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

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.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge
 




Impressum  | Datei:   | Haftungsausschluß  | Kontakt  | Seitenstruktur  | © 2026 JDD |