fortify-headers

standalone fortify-source implementation
git clone git://git.2f30.org/fortify-headers
Log | Files | Refs | README | LICENSE

common.h (1706B)


      1 /* Copyright (C) 2004-2020 Free Software Foundation, Inc.
      2    This snippet is taken from debug/tst-chk1 in the GNU C Library.
      3 
      4    The GNU C Library is free software; you can redistribute it and/or
      5    modify it under the terms of the GNU Lesser General Public
      6    License as published by the Free Software Foundation; either
      7    version 2.1 of the License, or (at your option) any later version.
      8 
      9    The GNU C Library is distributed in the hope that it will be useful,
     10    but WITHOUT ANY WARRANTY; without even the implied warranty of
     11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     12    Lesser General Public License for more details.
     13 
     14    You should have received a copy of the GNU Lesser General Public
     15    License along with the GNU C Library; if not, see
     16    <https://www.gnu.org/licenses/>.  */
     17 
     18 #include <setjmp.h>
     19 #include <unistd.h>
     20 #include <signal.h>
     21 #include <stdio.h>
     22 
     23 volatile int chk_fail_ok;
     24 volatile int ret;
     25 jmp_buf chk_fail_buf;
     26 
     27 static void
     28 handler (int sig)
     29 {
     30   if (chk_fail_ok)
     31     {
     32       chk_fail_ok = 0;
     33       longjmp (chk_fail_buf, 1);
     34     }
     35   else
     36     _exit (127);
     37 }
     38 
     39 void
     40 __attribute__((constructor))
     41 set_fortify_handler (void)
     42 {
     43   struct sigaction sa;
     44 
     45   sa.sa_handler = handler;
     46   sa.sa_flags = 0;
     47   sigemptyset (&sa.sa_mask);
     48 
     49   sigaction (SIGILL, &sa, NULL);
     50   sigaction (SIGTRAP, &sa, NULL);
     51 }
     52 
     53 #define FAIL() \
     54   do { fprintf (stderr, "Failure in %s:%d\n", __FILE__, __LINE__); ret = 1; } while (0)
     55 #define CHK_FAIL_START \
     56   chk_fail_ok = 1;                              \
     57   if (! setjmp (chk_fail_buf))                  \
     58     {
     59 #define CHK_FAIL_END \
     60       chk_fail_ok = 0;                          \
     61       FAIL ();                                  \
     62     }
     63