summaryrefslogtreecommitdiff
path: root/db/db.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'db/db.cpp')
-rw-r--r--db/db.cpp29
1 files changed, 25 insertions, 4 deletions
diff --git a/db/db.cpp b/db/db.cpp
index 548ac14..97869c5 100644
--- a/db/db.cpp
+++ b/db/db.cpp
@@ -808,7 +808,7 @@ int main(int argc, char* argv[]) {
cmdLine.durOptions = params["durOptions"].as<int>();
}
if (params.count("journalOptions")) {
- cmdLine.durOptions = params["durOptions"].as<int>();
+ cmdLine.durOptions = params["journalOptions"].as<int>();
}
if (params.count("objcheck")) {
objcheck = true;
@@ -1116,6 +1116,19 @@ namespace mongo {
dbexit( EXIT_ABRUPT );
}
+ void abruptQuitWithAddrSignal( int signal, siginfo_t *siginfo, void * ) {
+ ostringstream oss;
+ oss << "Invalid";
+ if ( signal == SIGSEGV || signal == SIGBUS ) {
+ oss << " access";
+ } else {
+ oss << " operation";
+ }
+ oss << " at address: " << siginfo->si_addr << endl;
+ rawOut( oss.str() );
+ abruptQuit( signal );
+ }
+
sigset_t asyncSignals;
// The above signals will be processed by this thread only, in order to
// ensure the db and log mutexes aren't held.
@@ -1138,10 +1151,18 @@ namespace mongo {
void setupSignals_ignoreHelper( int signal ) {}
void setupSignals( bool inFork ) {
- assert( signal(SIGSEGV, abruptQuit) != SIG_ERR );
- assert( signal(SIGFPE, abruptQuit) != SIG_ERR );
+ struct sigaction addrSignals;
+ memset( &addrSignals, 0, sizeof( struct sigaction ) );
+ addrSignals.sa_sigaction = abruptQuitWithAddrSignal;
+ sigemptyset( &addrSignals.sa_mask );
+ addrSignals.sa_flags = SA_SIGINFO;
+
+ assert( sigaction(SIGSEGV, &addrSignals, 0) == 0 );
+ assert( sigaction(SIGBUS, &addrSignals, 0) == 0 );
+ assert( sigaction(SIGILL, &addrSignals, 0) == 0 );
+ assert( sigaction(SIGFPE, &addrSignals, 0) == 0 );
+
assert( signal(SIGABRT, abruptQuit) != SIG_ERR );
- assert( signal(SIGBUS, abruptQuit) != SIG_ERR );
assert( signal(SIGQUIT, abruptQuit) != SIG_ERR );
assert( signal(SIGPIPE, pipeSigHandler) != SIG_ERR );