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
This commit is contained in:
Török Edvin
2008-02-07 20:47:50 +00:00
parent 6b656d3608
commit efac2f09b7
4 changed files with 39 additions and 7 deletions

View File

@@ -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

View File

@@ -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));

View File

@@ -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);

View File

@@ -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 */