autofs-5.0.4 - allow the automount daemon to dump core From: Jeff Moyer Right now, the automount daemon blocks all signals. We should at least unblock those that will cause us to dump core. Otherwise, I think the behaviour could be, umm, interesting. I tested this by sending SIGBUS and SIGSEGV to the automount daemon. edit - raven - I changed this a little so that the change to the signals is done in one place and added SIGABRT and SIGTRAP to the list of signals that aren't blocked. Signed-off-by: Jeff Moyer --- CHANGELOG | 1 + daemon/automount.c | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 7f27f5e..4b85649 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -57,6 +57,7 @@ - mannual umount recovery fixes. - fix map type info parse error. - fix an RPC fd leak. +- don't block signals we expect to dump core. 4/11/2008 autofs-5.0.4 ----------------------- diff --git a/daemon/automount.c b/daemon/automount.c index 44dcdd6..e7f801b 100644 --- a/daemon/automount.c +++ b/daemon/automount.c @@ -64,6 +64,8 @@ static int st_stat = 1; static int *pst_stat = &st_stat; static pthread_t state_mach_thid; +static sigset_t block_sigs; + /* Pre-calculated kernel packet length */ static size_t kpkt_len; @@ -1321,7 +1323,7 @@ static void *statemachine(void *arg) sigset_t signalset; int sig; - sigfillset(&signalset); + memcpy(&signalset, &block_sigs, sizeof(signalset)); sigdelset(&signalset, SIGCHLD); sigdelset(&signalset, SIGCONT); @@ -1817,7 +1819,6 @@ int main(int argc, char *argv[]) unsigned foreground, have_global_options; time_t timeout; time_t age = time(NULL); - sigset_t allsigs; struct rlimit rlim; static const struct option long_options[] = { {"help", 0, 0, 'h'}, @@ -1837,8 +1838,15 @@ int main(int argc, char *argv[]) {0, 0, 0, 0} }; - sigfillset(&allsigs); - sigprocmask(SIG_BLOCK, &allsigs, NULL); + sigfillset(&block_sigs); + /* allow for the dropping of core files */ + sigdelset(&block_sigs, SIGABRT); + sigdelset(&block_sigs, SIGBUS); + sigdelset(&block_sigs, SIGSEGV); + sigdelset(&block_sigs, SIGILL); + sigdelset(&block_sigs, SIGFPE); + sigdelset(&block_sigs, SIGTRAP); + sigprocmask(SIG_BLOCK, &block_sigs, NULL); program = argv[0];