LCOV - code coverage report
Current view: top level - arch/x86/kernel - signal_compat.c (source / functions) Hit Total Coverage
Test: landlock.info Lines: 88 89 98.9 %
Date: 2021-04-22 12:43:58 Functions: 1 1 100.0 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0
       2             : #include <linux/compat.h>
       3             : #include <linux/uaccess.h>
       4             : #include <linux/ptrace.h>
       5             : 
       6             : /*
       7             :  * The compat_siginfo_t structure and handing code is very easy
       8             :  * to break in several ways.  It must always be updated when new
       9             :  * updates are made to the main siginfo_t, and
      10             :  * copy_siginfo_to_user32() must be updated when the
      11             :  * (arch-independent) copy_siginfo_to_user() is updated.
      12             :  *
      13             :  * It is also easy to put a new member in the compat_siginfo_t
      14             :  * which has implicit alignment which can move internal structure
      15             :  * alignment around breaking the ABI.  This can happen if you,
      16             :  * for instance, put a plain 64-bit value in there.
      17             :  */
      18        9309 : static inline void signal_compat_build_tests(void)
      19             : {
      20        9309 :         int _sifields_offset = offsetof(compat_siginfo_t, _sifields);
      21             : 
      22             :         /*
      23             :          * If adding a new si_code, there is probably new data in
      24             :          * the siginfo.  Make sure folks bumping the si_code
      25             :          * limits also have to look at this code.  Make sure any
      26             :          * new fields are handled in copy_siginfo_to_user32()!
      27             :          */
      28        9309 :         BUILD_BUG_ON(NSIGILL  != 11);
      29        9309 :         BUILD_BUG_ON(NSIGFPE  != 15);
      30        9309 :         BUILD_BUG_ON(NSIGSEGV != 9);
      31        9309 :         BUILD_BUG_ON(NSIGBUS  != 5);
      32        9309 :         BUILD_BUG_ON(NSIGTRAP != 5);
      33        9309 :         BUILD_BUG_ON(NSIGCHLD != 6);
      34        9309 :         BUILD_BUG_ON(NSIGSYS  != 2);
      35             : 
      36             :         /* This is part of the ABI and can never change in size: */
      37        9309 :         BUILD_BUG_ON(sizeof(compat_siginfo_t) != 128);
      38             :         /*
      39             :          * The offsets of all the (unioned) si_fields are fixed
      40             :          * in the ABI, of course.  Make sure none of them ever
      41             :          * move and are always at the beginning:
      42             :          */
      43        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, _sifields) != 3 * sizeof(int));
      44             : #define CHECK_CSI_OFFSET(name)    BUILD_BUG_ON(_sifields_offset != offsetof(compat_siginfo_t, _sifields.name))
      45             : 
      46        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_signo) != 0);
      47        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_errno) != 4);
      48        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_code)  != 8);
      49             : 
      50        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_signo) != 0);
      51        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_errno) != 4);
      52        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_code)  != 8);
      53             :          /*
      54             :          * Ensure that the size of each si_field never changes.
      55             :          * If it does, it is a sign that the
      56             :          * copy_siginfo_to_user32() code below needs to updated
      57             :          * along with the size in the CHECK_SI_SIZE().
      58             :          *
      59             :          * We repeat this check for both the generic and compat
      60             :          * siginfos.
      61             :          *
      62             :          * Note: it is OK for these to grow as long as the whole
      63             :          * structure stays within the padding size (checked
      64             :          * above).
      65             :          */
      66             : #define CHECK_CSI_SIZE(name, size) BUILD_BUG_ON(size != sizeof(((compat_siginfo_t *)0)->_sifields.name))
      67             : #define CHECK_SI_SIZE(name, size) BUILD_BUG_ON(size != sizeof(((siginfo_t *)0)->_sifields.name))
      68             : 
      69        9309 :         CHECK_CSI_OFFSET(_kill);
      70        9309 :         CHECK_CSI_SIZE  (_kill, 2*sizeof(int));
      71        9309 :         CHECK_SI_SIZE   (_kill, 2*sizeof(int));
      72             : 
      73        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_pid) != 0x10);
      74        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_uid) != 0x14);
      75        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_pid) != 0xC);
      76        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_uid) != 0x10);
      77             : 
      78        9309 :         CHECK_CSI_OFFSET(_timer);
      79        9309 :         CHECK_CSI_SIZE  (_timer, 3*sizeof(int));
      80        9309 :         CHECK_SI_SIZE   (_timer, 6*sizeof(int));
      81             : 
      82        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_tid)     != 0x10);
      83        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_overrun) != 0x14);
      84        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_value)   != 0x18);
      85        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_tid)     != 0x0C);
      86        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_overrun) != 0x10);
      87        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_value)   != 0x14);
      88             : 
      89        9309 :         CHECK_CSI_OFFSET(_rt);
      90        9309 :         CHECK_CSI_SIZE  (_rt, 3*sizeof(int));
      91        9309 :         CHECK_SI_SIZE   (_rt, 4*sizeof(int));
      92             : 
      93        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_pid)   != 0x10);
      94        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_uid)   != 0x14);
      95        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_value) != 0x18);
      96        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_pid)   != 0x0C);
      97        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_uid)   != 0x10);
      98        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_value) != 0x14);
      99             : 
     100        9309 :         CHECK_CSI_OFFSET(_sigchld);
     101        9309 :         CHECK_CSI_SIZE  (_sigchld, 5*sizeof(int));
     102        9309 :         CHECK_SI_SIZE   (_sigchld, 8*sizeof(int));
     103             : 
     104        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_pid)    != 0x10);
     105        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_uid)    != 0x14);
     106        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_status) != 0x18);
     107        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_utime)  != 0x20);
     108        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_stime)  != 0x28);
     109        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_pid)    != 0x0C);
     110        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_uid)    != 0x10);
     111        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_status) != 0x14);
     112        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_utime)  != 0x18);
     113        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_stime)  != 0x1C);
     114             : 
     115             : #ifdef CONFIG_X86_X32_ABI
     116             :         CHECK_CSI_OFFSET(_sigchld_x32);
     117             :         CHECK_CSI_SIZE  (_sigchld_x32, 7*sizeof(int));
     118             :         /* no _sigchld_x32 in the generic siginfo_t */
     119             :         BUILD_BUG_ON(offsetof(compat_siginfo_t, _sifields._sigchld_x32._utime)  != 0x18);
     120             :         BUILD_BUG_ON(offsetof(compat_siginfo_t, _sifields._sigchld_x32._stime)  != 0x20);
     121             : #endif
     122             : 
     123        9309 :         CHECK_CSI_OFFSET(_sigfault);
     124        9309 :         CHECK_CSI_SIZE  (_sigfault, 4*sizeof(int));
     125        9309 :         CHECK_SI_SIZE   (_sigfault, 8*sizeof(int));
     126             : 
     127        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_addr) != 0x10);
     128        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_addr) != 0x0C);
     129             : 
     130        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_addr_lsb) != 0x18);
     131        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_addr_lsb) != 0x10);
     132             : 
     133        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_lower) != 0x20);
     134        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_upper) != 0x28);
     135        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_lower) != 0x14);
     136        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_upper) != 0x18);
     137             : 
     138        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_pkey) != 0x20);
     139        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_pkey) != 0x14);
     140             : 
     141        9309 :         CHECK_CSI_OFFSET(_sigpoll);
     142        9309 :         CHECK_CSI_SIZE  (_sigpoll, 2*sizeof(int));
     143        9309 :         CHECK_SI_SIZE   (_sigpoll, 4*sizeof(int));
     144             : 
     145        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_band)   != 0x10);
     146        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_fd)     != 0x18);
     147        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_band) != 0x0C);
     148        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_fd)   != 0x10);
     149             : 
     150        9309 :         CHECK_CSI_OFFSET(_sigsys);
     151        9309 :         CHECK_CSI_SIZE  (_sigsys, 3*sizeof(int));
     152        9309 :         CHECK_SI_SIZE   (_sigsys, 4*sizeof(int));
     153             : 
     154        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_call_addr) != 0x10);
     155        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_syscall)   != 0x18);
     156        9309 :         BUILD_BUG_ON(offsetof(siginfo_t, si_arch)      != 0x1C);
     157        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_call_addr) != 0x0C);
     158        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_syscall)   != 0x10);
     159        9309 :         BUILD_BUG_ON(offsetof(compat_siginfo_t, si_arch)      != 0x14);
     160             : 
     161             :         /* any new si_fields should be added here */
     162             : }
     163             : 
     164        9309 : void sigaction_compat_abi(struct k_sigaction *act, struct k_sigaction *oact)
     165             : {
     166        9309 :         signal_compat_build_tests();
     167             : 
     168        9309 :         if (!act)
     169             :                 return;
     170             : 
     171        6148 :         if (in_ia32_syscall())
     172           0 :                 act->sa.sa_flags |= SA_IA32_ABI;
     173             :         if (in_x32_syscall())
     174             :                 act->sa.sa_flags |= SA_X32_ABI;
     175             : }

Generated by: LCOV version 1.14