LCOV - code coverage report
Current view: top level - include/linux - signal.h (source / functions) Hit Total Coverage
Test: landlock.info Lines: 45 56 80.4 %
Date: 2021-04-22 12:43:58 Functions: 0 0 -

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0 */
       2             : #ifndef _LINUX_SIGNAL_H
       3             : #define _LINUX_SIGNAL_H
       4             : 
       5             : #include <linux/bug.h>
       6             : #include <linux/signal_types.h>
       7             : #include <linux/string.h>
       8             : 
       9             : struct task_struct;
      10             : 
      11             : /* for sysctl */
      12             : extern int print_fatal_signals;
      13             : 
      14        1062 : static inline void copy_siginfo(kernel_siginfo_t *to,
      15             :                                 const kernel_siginfo_t *from)
      16             : {
      17         530 :         memcpy(to, from, sizeof(*to));
      18         532 : }
      19             : 
      20         926 : static inline void clear_siginfo(kernel_siginfo_t *info)
      21             : {
      22         926 :         memset(info, 0, sizeof(*info));
      23             : }
      24             : 
      25             : #define SI_EXPANSION_SIZE (sizeof(struct siginfo) - sizeof(struct kernel_siginfo))
      26             : 
      27             : static inline void copy_siginfo_to_external(siginfo_t *to,
      28             :                                             const kernel_siginfo_t *from)
      29             : {
      30             :         memcpy(to, from, sizeof(*from));
      31             :         memset(((char *)to) + sizeof(struct kernel_siginfo), 0,
      32             :                 SI_EXPANSION_SIZE);
      33             : }
      34             : 
      35             : int copy_siginfo_to_user(siginfo_t __user *to, const kernel_siginfo_t *from);
      36             : int copy_siginfo_from_user(kernel_siginfo_t *to, const siginfo_t __user *from);
      37             : 
      38             : enum siginfo_layout {
      39             :         SIL_KILL,
      40             :         SIL_TIMER,
      41             :         SIL_POLL,
      42             :         SIL_FAULT,
      43             :         SIL_FAULT_MCEERR,
      44             :         SIL_FAULT_BNDERR,
      45             :         SIL_FAULT_PKUERR,
      46             :         SIL_CHLD,
      47             :         SIL_RT,
      48             :         SIL_SYS,
      49             : };
      50             : 
      51             : enum siginfo_layout siginfo_layout(unsigned sig, int si_code);
      52             : 
      53             : /*
      54             :  * Define some primitives to manipulate sigset_t.
      55             :  */
      56             : 
      57             : #ifndef __HAVE_ARCH_SIG_BITOPS
      58             : #include <linux/bitops.h>
      59             : 
      60             : /* We don't use <linux/bitops.h> for these because there is no need to
      61             :    be atomic.  */
      62        4866 : static inline void sigaddset(sigset_t *set, int _sig)
      63             : {
      64        4866 :         unsigned long sig = _sig - 1;
      65        4866 :         if (_NSIG_WORDS == 1)
      66        4405 :                 set->sig[0] |= 1UL << sig;
      67             :         else
      68             :                 set->sig[sig / _NSIG_BPW] |= 1UL << (sig % _NSIG_BPW);
      69        4070 : }
      70             : 
      71         530 : static inline void sigdelset(sigset_t *set, int _sig)
      72             : {
      73         530 :         unsigned long sig = _sig - 1;
      74         530 :         if (_NSIG_WORDS == 1)
      75         530 :                 set->sig[0] &= ~(1UL << sig);
      76             :         else
      77             :                 set->sig[sig / _NSIG_BPW] &= ~(1UL << (sig % _NSIG_BPW));
      78           0 : }
      79             : 
      80       16305 : static inline int sigismember(sigset_t *set, int _sig)
      81             : {
      82       16305 :         unsigned long sig = _sig - 1;
      83       16305 :         if (_NSIG_WORDS == 1)
      84        7128 :                 return 1 & (set->sig[0] >> sig);
      85             :         else
      86             :                 return 1 & (set->sig[sig / _NSIG_BPW] >> (sig % _NSIG_BPW));
      87             : }
      88             : 
      89             : #endif /* __HAVE_ARCH_SIG_BITOPS */
      90             : 
      91         550 : static inline int sigisemptyset(sigset_t *set)
      92             : {
      93         550 :         switch (_NSIG_WORDS) {
      94             :         case 4:
      95             :                 return (set->sig[3] | set->sig[2] |
      96             :                         set->sig[1] | set->sig[0]) == 0;
      97             :         case 2:
      98             :                 return (set->sig[1] | set->sig[0]) == 0;
      99             :         case 1:
     100         550 :                 return set->sig[0] == 0;
     101             :         default:
     102             :                 BUILD_BUG();
     103             :                 return 0;
     104             :         }
     105             : }
     106             : 
     107        2732 : static inline int sigequalsets(const sigset_t *set1, const sigset_t *set2)
     108             : {
     109        2732 :         switch (_NSIG_WORDS) {
     110             :         case 4:
     111             :                 return  (set1->sig[3] == set2->sig[3]) &&
     112             :                         (set1->sig[2] == set2->sig[2]) &&
     113             :                         (set1->sig[1] == set2->sig[1]) &&
     114             :                         (set1->sig[0] == set2->sig[0]);
     115             :         case 2:
     116             :                 return  (set1->sig[1] == set2->sig[1]) &&
     117             :                         (set1->sig[0] == set2->sig[0]);
     118             :         case 1:
     119        2732 :                 return  set1->sig[0] == set2->sig[0];
     120             :         }
     121             :         return 0;
     122             : }
     123             : 
     124             : #define sigmask(sig)    (1UL << ((sig) - 1))
     125             : 
     126             : #ifndef __HAVE_ARCH_SIG_SETOPS
     127             : #include <linux/string.h>
     128             : 
     129             : #define _SIG_SET_BINOP(name, op)                                        \
     130             : static inline void name(sigset_t *r, const sigset_t *a, const sigset_t *b) \
     131             : {                                                                       \
     132             :         unsigned long a0, a1, a2, a3, b0, b1, b2, b3;                   \
     133             :                                                                         \
     134             :         switch (_NSIG_WORDS) {                                          \
     135             :         case 4:                                                         \
     136             :                 a3 = a->sig[3]; a2 = a->sig[2];                           \
     137             :                 b3 = b->sig[3]; b2 = b->sig[2];                           \
     138             :                 r->sig[3] = op(a3, b3);                                      \
     139             :                 r->sig[2] = op(a2, b2);                                      \
     140             :                 fallthrough;                                            \
     141             :         case 2:                                                         \
     142             :                 a1 = a->sig[1]; b1 = b->sig[1];                           \
     143             :                 r->sig[1] = op(a1, b1);                                      \
     144             :                 fallthrough;                                            \
     145             :         case 1:                                                         \
     146             :                 a0 = a->sig[0]; b0 = b->sig[0];                           \
     147             :                 r->sig[0] = op(a0, b0);                                      \
     148             :                 break;                                                  \
     149             :         default:                                                        \
     150             :                 BUILD_BUG();                                            \
     151             :         }                                                               \
     152             : }
     153             : 
     154             : #define _sig_or(x,y)    ((x) | (y))
     155        1130 : _SIG_SET_BINOP(sigorsets, _sig_or)
     156             : 
     157             : #define _sig_and(x,y)   ((x) & (y))
     158         551 : _SIG_SET_BINOP(sigandsets, _sig_and)
     159             : 
     160             : #define _sig_andn(x,y)  ((x) & ~(y))
     161         342 : _SIG_SET_BINOP(sigandnsets, _sig_andn)
     162             : 
     163             : #undef _SIG_SET_BINOP
     164             : #undef _sig_or
     165             : #undef _sig_and
     166             : #undef _sig_andn
     167             : 
     168             : #define _SIG_SET_OP(name, op)                                           \
     169             : static inline void name(sigset_t *set)                                  \
     170             : {                                                                       \
     171             :         switch (_NSIG_WORDS) {                                          \
     172             :         case 4: set->sig[3] = op(set->sig[3]);                            \
     173             :                 set->sig[2] = op(set->sig[2]);                            \
     174             :                 fallthrough;                                            \
     175             :         case 2: set->sig[1] = op(set->sig[1]);                            \
     176             :                 fallthrough;                                            \
     177             :         case 1: set->sig[0] = op(set->sig[0]);                            \
     178             :                     break;                                              \
     179             :         default:                                                        \
     180             :                 BUILD_BUG();                                            \
     181             :         }                                                               \
     182             : }
     183             : 
     184             : #define _sig_not(x)     (~(x))
     185          38 : _SIG_SET_OP(signotset, _sig_not)
     186             : 
     187             : #undef _SIG_SET_OP
     188             : #undef _sig_not
     189             : 
     190       42729 : static inline void sigemptyset(sigset_t *set)
     191             : {
     192       42729 :         switch (_NSIG_WORDS) {
     193             :         default:
     194             :                 memset(set, 0, sizeof(sigset_t));
     195             :                 break;
     196             :         case 2: set->sig[1] = 0;
     197       42729 :                 fallthrough;
     198       42729 :         case 1: set->sig[0] = 0;
     199       39187 :                 break;
     200             :         }
     201        1716 : }
     202             : 
     203           0 : static inline void sigfillset(sigset_t *set)
     204             : {
     205           0 :         switch (_NSIG_WORDS) {
     206             :         default:
     207             :                 memset(set, -1, sizeof(sigset_t));
     208             :                 break;
     209             :         case 2: set->sig[1] = -1;
     210           0 :                 fallthrough;
     211           0 :         case 1: set->sig[0] = -1;
     212           0 :                 break;
     213             :         }
     214             : }
     215             : 
     216             : /* Some extensions for manipulating the low 32 signals in particular.  */
     217             : 
     218           0 : static inline void sigaddsetmask(sigset_t *set, unsigned long mask)
     219             : {
     220           0 :         set->sig[0] |= mask;
     221           0 : }
     222             : 
     223        5673 : static inline void sigdelsetmask(sigset_t *set, unsigned long mask)
     224             : {
     225        5673 :         set->sig[0] &= ~mask;
     226           0 : }
     227             : 
     228             : static inline int sigtestsetmask(sigset_t *set, unsigned long mask)
     229             : {
     230             :         return (set->sig[0] & mask) != 0;
     231             : }
     232             : 
     233          15 : static inline void siginitset(sigset_t *set, unsigned long mask)
     234             : {
     235          15 :         set->sig[0] = mask;
     236          15 :         switch (_NSIG_WORDS) {
     237             :         default:
     238             :                 memset(&set->sig[1], 0, sizeof(long)*(_NSIG_WORDS-1));
     239             :                 break;
     240             :         case 2: set->sig[1] = 0;
     241             :                 break;
     242          15 :         case 1: ;
     243             :         }
     244           0 : }
     245             : 
     246             : static inline void siginitsetinv(sigset_t *set, unsigned long mask)
     247             : {
     248             :         set->sig[0] = ~mask;
     249             :         switch (_NSIG_WORDS) {
     250             :         default:
     251             :                 memset(&set->sig[1], -1, sizeof(long)*(_NSIG_WORDS-1));
     252             :                 break;
     253             :         case 2: set->sig[1] = -1;
     254             :                 break;
     255             :         case 1: ;
     256             :         }
     257             : }
     258             : 
     259             : #endif /* __HAVE_ARCH_SIG_SETOPS */
     260             : 
     261        1826 : static inline void init_sigpending(struct sigpending *sig)
     262             : {
     263        1826 :         sigemptyset(&sig->signal);
     264        1826 :         INIT_LIST_HEAD(&sig->list);
     265             : }
     266             : 
     267             : extern void flush_sigqueue(struct sigpending *queue);
     268             : 
     269             : /* Test if 'sig' is valid signal. Use this instead of testing _NSIG directly */
     270        4606 : static inline int valid_signal(unsigned long sig)
     271             : {
     272        4606 :         return sig <= _NSIG ? 1 : 0;
     273             : }
     274             : 
     275             : struct timespec;
     276             : struct pt_regs;
     277             : enum pid_type;
     278             : 
     279             : extern int next_signal(struct sigpending *pending, sigset_t *mask);
     280             : extern int do_send_sig_info(int sig, struct kernel_siginfo *info,
     281             :                                 struct task_struct *p, enum pid_type type);
     282             : extern int group_send_sig_info(int sig, struct kernel_siginfo *info,
     283             :                                struct task_struct *p, enum pid_type type);
     284             : extern int __group_send_sig_info(int, struct kernel_siginfo *, struct task_struct *);
     285             : extern int sigprocmask(int, sigset_t *, sigset_t *);
     286             : extern void set_current_blocked(sigset_t *);
     287             : extern void __set_current_blocked(const sigset_t *);
     288             : extern int show_unhandled_signals;
     289             : 
     290             : extern bool get_signal(struct ksignal *ksig);
     291             : extern void signal_setup_done(int failed, struct ksignal *ksig, int stepping);
     292             : extern void exit_signals(struct task_struct *tsk);
     293             : extern void kernel_sigaction(int, __sighandler_t);
     294             : 
     295             : #define SIG_KTHREAD ((__force __sighandler_t)2)
     296             : #define SIG_KTHREAD_KERNEL ((__force __sighandler_t)3)
     297             : 
     298             : static inline void allow_signal(int sig)
     299             : {
     300             :         /*
     301             :          * Kernel threads handle their own signals. Let the signal code
     302             :          * know it'll be handled, so that they don't get converted to
     303             :          * SIGKILL or just silently dropped.
     304             :          */
     305             :         kernel_sigaction(sig, SIG_KTHREAD);
     306             : }
     307             : 
     308             : static inline void allow_kernel_signal(int sig)
     309             : {
     310             :         /*
     311             :          * Kernel threads handle their own signals. Let the signal code
     312             :          * know signals sent by the kernel will be handled, so that they
     313             :          * don't get silently dropped.
     314             :          */
     315             :         kernel_sigaction(sig, SIG_KTHREAD_KERNEL);
     316             : }
     317             : 
     318             : static inline void disallow_signal(int sig)
     319             : {
     320             :         kernel_sigaction(sig, SIG_IGN);
     321             : }
     322             : 
     323             : extern struct kmem_cache *sighand_cachep;
     324             : 
     325             : extern bool unhandled_signal(struct task_struct *tsk, int sig);
     326             : 
     327             : /*
     328             :  * In POSIX a signal is sent either to a specific thread (Linux task)
     329             :  * or to the process as a whole (Linux thread group).  How the signal
     330             :  * is sent determines whether it's to one thread or the whole group,
     331             :  * which determines which signal mask(s) are involved in blocking it
     332             :  * from being delivered until later.  When the signal is delivered,
     333             :  * either it's caught or ignored by a user handler or it has a default
     334             :  * effect that applies to the whole thread group (POSIX process).
     335             :  *
     336             :  * The possible effects an unblocked signal set to SIG_DFL can have are:
     337             :  *   ignore     - Nothing Happens
     338             :  *   terminate  - kill the process, i.e. all threads in the group,
     339             :  *                similar to exit_group.  The group leader (only) reports
     340             :  *                WIFSIGNALED status to its parent.
     341             :  *   coredump   - write a core dump file describing all threads using
     342             :  *                the same mm and then kill all those threads
     343             :  *   stop       - stop all the threads in the group, i.e. TASK_STOPPED state
     344             :  *
     345             :  * SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.
     346             :  * Other signals when not blocked and set to SIG_DFL behaves as follows.
     347             :  * The job control signals also have other special effects.
     348             :  *
     349             :  *      +--------------------+------------------+
     350             :  *      |  POSIX signal      |  default action  |
     351             :  *      +--------------------+------------------+
     352             :  *      |  SIGHUP            |  terminate       |
     353             :  *      |  SIGINT            |  terminate       |
     354             :  *      |  SIGQUIT           |  coredump        |
     355             :  *      |  SIGILL            |  coredump        |
     356             :  *      |  SIGTRAP           |  coredump        |
     357             :  *      |  SIGABRT/SIGIOT    |  coredump        |
     358             :  *      |  SIGBUS            |  coredump        |
     359             :  *      |  SIGFPE            |  coredump        |
     360             :  *      |  SIGKILL           |  terminate(+)    |
     361             :  *      |  SIGUSR1           |  terminate       |
     362             :  *      |  SIGSEGV           |  coredump        |
     363             :  *      |  SIGUSR2           |  terminate       |
     364             :  *      |  SIGPIPE           |  terminate       |
     365             :  *      |  SIGALRM           |  terminate       |
     366             :  *      |  SIGTERM           |  terminate       |
     367             :  *      |  SIGCHLD           |  ignore          |
     368             :  *      |  SIGCONT           |  ignore(*)       |
     369             :  *      |  SIGSTOP           |  stop(*)(+)      |
     370             :  *      |  SIGTSTP           |  stop(*)         |
     371             :  *      |  SIGTTIN           |  stop(*)         |
     372             :  *      |  SIGTTOU           |  stop(*)         |
     373             :  *      |  SIGURG            |  ignore          |
     374             :  *      |  SIGXCPU           |  coredump        |
     375             :  *      |  SIGXFSZ           |  coredump        |
     376             :  *      |  SIGVTALRM         |  terminate       |
     377             :  *      |  SIGPROF           |  terminate       |
     378             :  *      |  SIGPOLL/SIGIO     |  terminate       |
     379             :  *      |  SIGSYS/SIGUNUSED  |  coredump        |
     380             :  *      |  SIGSTKFLT         |  terminate       |
     381             :  *      |  SIGWINCH          |  ignore          |
     382             :  *      |  SIGPWR            |  terminate       |
     383             :  *      |  SIGRTMIN-SIGRTMAX |  terminate       |
     384             :  *      +--------------------+------------------+
     385             :  *      |  non-POSIX signal  |  default action  |
     386             :  *      +--------------------+------------------+
     387             :  *      |  SIGEMT            |  coredump        |
     388             :  *      +--------------------+------------------+
     389             :  *
     390             :  * (+) For SIGKILL and SIGSTOP the action is "always", not just "default".
     391             :  * (*) Special job control effects:
     392             :  * When SIGCONT is sent, it resumes the process (all threads in the group)
     393             :  * from TASK_STOPPED state and also clears any pending/queued stop signals
     394             :  * (any of those marked with "stop(*)").  This happens regardless of blocking,
     395             :  * catching, or ignoring SIGCONT.  When any stop signal is sent, it clears
     396             :  * any pending/queued SIGCONT signals; this happens regardless of blocking,
     397             :  * catching, or ignored the stop signal, though (except for SIGSTOP) the
     398             :  * default action of stopping the process may happen later or never.
     399             :  */
     400             : 
     401             : #ifdef SIGEMT
     402             : #define SIGEMT_MASK     rt_sigmask(SIGEMT)
     403             : #else
     404             : #define SIGEMT_MASK     0
     405             : #endif
     406             : 
     407             : #if SIGRTMIN > BITS_PER_LONG
     408             : #define rt_sigmask(sig) (1ULL << ((sig)-1))
     409             : #else
     410             : #define rt_sigmask(sig) sigmask(sig)
     411             : #endif
     412             : 
     413             : #define siginmask(sig, mask) \
     414             :         ((sig) > 0 && (sig) < SIGRTMIN && (rt_sigmask(sig) & (mask)))
     415             : 
     416             : #define SIG_KERNEL_ONLY_MASK (\
     417             :         rt_sigmask(SIGKILL)   |  rt_sigmask(SIGSTOP))
     418             : 
     419             : #define SIG_KERNEL_STOP_MASK (\
     420             :         rt_sigmask(SIGSTOP)   |  rt_sigmask(SIGTSTP)   | \
     421             :         rt_sigmask(SIGTTIN)   |  rt_sigmask(SIGTTOU)   )
     422             : 
     423             : #define SIG_KERNEL_COREDUMP_MASK (\
     424             :         rt_sigmask(SIGQUIT)   |  rt_sigmask(SIGILL)    | \
     425             :         rt_sigmask(SIGTRAP)   |  rt_sigmask(SIGABRT)   | \
     426             :         rt_sigmask(SIGFPE)    |  rt_sigmask(SIGSEGV)   | \
     427             :         rt_sigmask(SIGBUS)    |  rt_sigmask(SIGSYS)    | \
     428             :         rt_sigmask(SIGXCPU)   |  rt_sigmask(SIGXFSZ)   | \
     429             :         SIGEMT_MASK                                    )
     430             : 
     431             : #define SIG_KERNEL_IGNORE_MASK (\
     432             :         rt_sigmask(SIGCONT)   |  rt_sigmask(SIGCHLD)   | \
     433             :         rt_sigmask(SIGWINCH)  |  rt_sigmask(SIGURG)    )
     434             : 
     435             : #define SIG_SPECIFIC_SICODES_MASK (\
     436             :         rt_sigmask(SIGILL)    |  rt_sigmask(SIGFPE)    | \
     437             :         rt_sigmask(SIGSEGV)   |  rt_sigmask(SIGBUS)    | \
     438             :         rt_sigmask(SIGTRAP)   |  rt_sigmask(SIGCHLD)   | \
     439             :         rt_sigmask(SIGPOLL)   |  rt_sigmask(SIGSYS)    | \
     440             :         SIGEMT_MASK                                    )
     441             : 
     442             : #define sig_kernel_only(sig)            siginmask(sig, SIG_KERNEL_ONLY_MASK)
     443             : #define sig_kernel_coredump(sig)        siginmask(sig, SIG_KERNEL_COREDUMP_MASK)
     444             : #define sig_kernel_ignore(sig)          siginmask(sig, SIG_KERNEL_IGNORE_MASK)
     445             : #define sig_kernel_stop(sig)            siginmask(sig, SIG_KERNEL_STOP_MASK)
     446             : #define sig_specific_sicodes(sig)       siginmask(sig, SIG_SPECIFIC_SICODES_MASK)
     447             : 
     448             : #define sig_fatal(t, signr) \
     449             :         (!siginmask(signr, SIG_KERNEL_IGNORE_MASK|SIG_KERNEL_STOP_MASK) && \
     450             :          (t)->sighand->action[(signr)-1].sa.sa_handler == SIG_DFL)
     451             : 
     452             : void signals_init(void);
     453             : 
     454             : int restore_altstack(const stack_t __user *);
     455             : int __save_altstack(stack_t __user *, unsigned long);
     456             : 
     457             : #define unsafe_save_altstack(uss, sp, label) do { \
     458             :         stack_t __user *__uss = uss; \
     459             :         struct task_struct *t = current; \
     460             :         unsafe_put_user((void __user *)t->sas_ss_sp, &__uss->ss_sp, label); \
     461             :         unsafe_put_user(t->sas_ss_flags, &__uss->ss_flags, label); \
     462             :         unsafe_put_user(t->sas_ss_size, &__uss->ss_size, label); \
     463             :         if (t->sas_ss_flags & SS_AUTODISARM) \
     464             :                 sas_ss_reset(t); \
     465             : } while (0);
     466             : 
     467             : #ifdef CONFIG_PROC_FS
     468             : struct seq_file;
     469             : extern void render_sigset_t(struct seq_file *, const char *, sigset_t *);
     470             : #endif
     471             : 
     472             : #ifndef arch_untagged_si_addr
     473             : /*
     474             :  * Given a fault address and a signal and si_code which correspond to the
     475             :  * _sigfault union member, returns the address that must appear in si_addr if
     476             :  * the signal handler does not have SA_EXPOSE_TAGBITS enabled in sa_flags.
     477             :  */
     478             : static inline void __user *arch_untagged_si_addr(void __user *addr,
     479             :                                                  unsigned long sig,
     480             :                                                  unsigned long si_code)
     481             : {
     482             :         return addr;
     483             : }
     484             : #endif
     485             : 
     486             : #endif /* _LINUX_SIGNAL_H */

Generated by: LCOV version 1.14