From efac2f09b709c4a45fc19e1b0b68b62bcda601d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?T=C3=B6r=C3=B6k=20Edvin?= Date: Thu, 7 Feb 2008 20:47:50 +0000 Subject: [PATCH] don't ignore SIGBUS, SIGFPE, SIGILL, and SIGSEGV. POSIX says the behaviour is undefined if they are ignored. (on HP-UX behaviour was: hang) make BIGSTACK the default on HPUX git-svn: trunk@3593 --- ChangeLog | 8 ++++++++ clamd/clamuko.c | 7 +++++++ clamd/server-th.c | 22 +++++++++++++++++----- clamd/thrmgr.c | 9 +++++++-- 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index ff7e3d640..f27e68d42 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Thu Feb 7 22:30:51 EET 2008 (edwin) +------------------------------------ + * clamd: (bb #803) + * don't ignore SIGBUS, SIGFPE, SIGILL, and SIGSEGV. + POSIX says the behaviour is undefined if they are ignored. + (on HP-UX behaviour was: hang) + * make BIGSTACK the default on HPUX + Wed Feb 6 21:30:55 CET 2008 (tk) --------------------------------- * libclamav/regex_list.c: compatibility with new matcher extension diff --git a/clamd/clamuko.c b/clamd/clamuko.c index 4fdb68a23..7ff7a4ca6 100644 --- a/clamd/clamuko.c +++ b/clamd/clamuko.c @@ -78,7 +78,14 @@ void *clamukoth(void *arg) /* ignore all signals except SIGUSR1 */ sigfillset(&sigset); sigdelset(&sigset, SIGUSR1); + /* The behavior of a process is undefined after it ignores a + * SIGFPE, SIGILL, SIGSEGV, or SIGBUS signal */ + sigdelset(&sigset, SIGFPE); + sigdelset(&sigset, SIGILL); sigdelset(&sigset, SIGSEGV); +#ifdef SIGBUS + sigdelset(&sigset, SIGBUS); +#endif pthread_sigmask(SIG_SETMASK, &sigset, NULL); act.sa_handler = clamuko_exit; sigfillset(&(act.sa_mask)); diff --git a/clamd/server-th.c b/clamd/server-th.c index deae8b749..c2f9a85ad 100644 --- a/clamd/server-th.c +++ b/clamd/server-th.c @@ -95,6 +95,14 @@ static void scanner_thread(void *arg) #ifndef C_WINDOWS /* ignore all signals */ sigfillset(&sigset); + /* The behavior of a process is undefined after it ignores a + * SIGFPE, SIGILL, SIGSEGV, or SIGBUS signal */ + sigdelset(&sigset, SIGFPE); + sigdelset(&sigset, SIGILL); + sigdelset(&sigset, SIGSEGV); +#ifdef SIGBUS + sigdelset(&sigset, SIGBUS); +#endif pthread_sigmask(SIG_SETMASK, &sigset, NULL); #endif @@ -280,10 +288,6 @@ int acceptloop_th(int *socketds, int nsockets, struct cl_engine *engine, unsigne pid_t mainpid; int idletimeout; -#if defined(C_BIGSTACK) || defined(C_BSD) - size_t stacksize; -#endif - #ifdef CLAMUKO pthread_t clamuko_pid; pthread_attr_t clamuko_attr; @@ -481,8 +485,16 @@ int acceptloop_th(int *socketds, int nsockets, struct cl_engine *engine, unsigne sigdelset(&sigset, SIGHUP); sigdelset(&sigset, SIGPIPE); sigdelset(&sigset, SIGUSR2); + /* The behavior of a process is undefined after it ignores a + * SIGFPE, SIGILL, SIGSEGV, or SIGBUS signal */ + sigdelset(&sigset, SIGFPE); + sigdelset(&sigset, SIGILL); + sigdelset(&sigset, SIGSEGV); +#ifdef SIGBUS + sigdelset(&sigset, SIGBUS); +#endif sigprocmask(SIG_SETMASK, &sigset, NULL); - + /* SIGINT, SIGTERM, SIGSEGV */ sigact.sa_handler = sighandler_th; sigemptyset(&sigact.sa_mask); diff --git a/clamd/thrmgr.c b/clamd/thrmgr.c index 82afe26c2..521d7d111 100644 --- a/clamd/thrmgr.c +++ b/clamd/thrmgr.c @@ -34,6 +34,11 @@ #define FALSE (0) #define TRUE (1) +/* BSD and HP-UX need a bigger stacksize than the system default */ +#if defined (C_BSD) || defined (C_HPUX) +#define C_BIGSTACK 1 +#endif + static work_queue_t *work_queue_new(void) { work_queue_t *work_q; @@ -133,7 +138,7 @@ void thrmgr_destroy(threadpool_t *threadpool) threadpool_t *thrmgr_new(int max_threads, int idle_timeout, void (*handler)(void *)) { threadpool_t *threadpool; -#if defined(C_BIGSTACK) || defined(C_BSD) +#if defined(C_BIGSTACK) size_t stacksize; #endif @@ -182,7 +187,7 @@ threadpool_t *thrmgr_new(int max_threads, int idle_timeout, void (*handler)(void return NULL; } -#if defined(C_BIGSTACK) || defined(C_BSD) +#if defined(C_BIGSTACK) pthread_attr_getstacksize(&(threadpool->pool_attr), &stacksize); stacksize = stacksize + 64 * 1024; if (stacksize < 1048576) stacksize = 1048576; /* at least 1MB please */