fortify-headers

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

common.h (1834B)


      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 #define _POSIX_C_SOURCE 2
     19 #define _XOPEN_SOURCE 700
     20 
     21 #include <setjmp.h>
     22 #include <unistd.h>
     23 #include <signal.h>
     24 #include <stdio.h>
     25 
     26 #ifndef _FORTIFY_HEADERS_H
     27 #error Never included fortify-headers.h
     28 #endif
     29 
     30 volatile int chk_fail_ok;
     31 volatile int ret;
     32 jmp_buf chk_fail_buf;
     33 
     34 static void
     35 handler (int sig)
     36 {
     37   if (chk_fail_ok)
     38     {
     39       chk_fail_ok = 0;
     40       longjmp (chk_fail_buf, 1);
     41     }
     42   else
     43     _exit (127);
     44 }
     45 
     46 void
     47 __attribute__((constructor))
     48 set_fortify_handler (void)
     49 {
     50   struct sigaction sa;
     51 
     52   sa.sa_handler = handler;
     53   sa.sa_flags = 0;
     54   sigemptyset (&sa.sa_mask);
     55 
     56   sigaction (SIGILL, &sa, NULL);
     57   sigaction (SIGTRAP, &sa, NULL);
     58 }
     59 
     60 #define FAIL() \
     61   do { fprintf (stderr, "Failure in %s:%d\n", __FILE__, __LINE__); ret = 1; } while (0)
     62 #define CHK_FAIL_START \
     63   chk_fail_ok = 1;                              \
     64   if (! setjmp (chk_fail_buf))                  \
     65     {
     66 #define CHK_FAIL_END \
     67       chk_fail_ok = 0;                          \
     68       FAIL ();                                  \
     69     }
     70