s4-smbtorture: add ndr test for nbt_netlogon_packet to avoid future regressions.
[Samba/gebeck_regimport.git] / lib / util / fault.c
blob7fe081d28558cb1f1de397b431e674295e4227c9
1 /*
2 Unix SMB/CIFS implementation.
3 Critical Fault handling
4 Copyright (C) Andrew Tridgell 1992-1998
5 Copyright (C) Tim Prouty 2009
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
21 #include "includes.h"
22 #include "system/filesys.h"
23 #include "version.h"
25 #ifdef HAVE_SYS_SYSCTL_H
26 #include <sys/sysctl.h>
27 #endif
30 #ifdef HAVE_SYS_PRCTL_H
31 #include <sys/prctl.h>
32 #endif
34 static struct {
35 bool disabled;
36 smb_panic_handler_t panic_handler;
37 } fault_state;
40 /*******************************************************************
41 setup variables used for fault handling
42 ********************************************************************/
43 void fault_configure(smb_panic_handler_t panic_handler)
45 fault_state.panic_handler = panic_handler;
49 /**
50 disable setting up fault handlers
51 This is used for the bind9 dlz module, as we
52 don't want a Samba module in bind9 to override the bind
53 fault handling
54 **/
55 _PUBLIC_ void fault_setup_disable(void)
57 fault_state.disabled = true;
61 /*******************************************************************
62 report a fault
63 ********************************************************************/
64 static void fault_report(int sig)
66 static int counter;
68 if (counter) _exit(1);
70 counter++;
72 DEBUGSEP(0);
73 DEBUG(0,("INTERNAL ERROR: Signal %d in pid %d (%s)",sig,(int)sys_getpid(),SAMBA_VERSION_STRING));
74 DEBUG(0,("\nPlease read the Trouble-Shooting section of the Samba HOWTO\n"));
75 DEBUGSEP(0);
77 smb_panic("internal error");
79 /* smb_panic() never returns, so this is really redundent */
80 exit(1);
83 /****************************************************************************
84 catch serious errors
85 ****************************************************************************/
86 static void sig_fault(int sig)
88 fault_report(sig);
91 /*******************************************************************
92 setup our fault handlers
93 ********************************************************************/
94 void fault_setup(void)
96 if (fault_state.disabled) {
97 return;
99 #ifdef SIGSEGV
100 CatchSignal(SIGSEGV, sig_fault);
101 #endif
102 #ifdef SIGBUS
103 CatchSignal(SIGBUS, sig_fault);
104 #endif
105 #ifdef SIGABRT
106 CatchSignal(SIGABRT, sig_fault);
107 #endif
110 _PUBLIC_ const char *panic_action = NULL;
113 default smb_panic() implementation
115 static void smb_panic_default(const char *why)
117 int result;
119 #if defined(HAVE_PRCTL) && defined(PR_SET_PTRACER)
121 * Make sure all children can attach a debugger.
123 prctl(PR_SET_PTRACER, getpid(), 0, 0, 0);
124 #endif
126 if (panic_action && *panic_action) {
127 char pidstr[20];
128 char cmdstring[200];
129 strlcpy(cmdstring, panic_action, sizeof(cmdstring));
130 snprintf(pidstr, sizeof(pidstr), "%d", (int) getpid());
131 all_string_sub(cmdstring, "%d", pidstr, sizeof(cmdstring));
132 DEBUG(0, ("smb_panic(): calling panic action [%s]\n", cmdstring));
133 result = system(cmdstring);
135 if (result == -1)
136 DEBUG(0, ("smb_panic(): fork failed in panic action: %s\n",
137 strerror(errno)));
138 else
139 DEBUG(0, ("smb_panic(): action returned status %d\n",
140 WEXITSTATUS(result)));
142 DEBUG(0,("PANIC: %s\n", why));
144 #ifdef SIGABRT
145 CatchSignal(SIGABRT, SIG_DFL);
146 #endif
147 abort();
152 Something really nasty happened - panic !
154 _PUBLIC_ void smb_panic(const char *why)
156 if (fault_state.panic_handler) {
157 fault_state.panic_handler(why);
158 _exit(1);
160 smb_panic_default(why);