diff options
author | pav <pav@FreeBSD.org> | 2004-06-01 06:56:57 +0800 |
---|---|---|
committer | pav <pav@FreeBSD.org> | 2004-06-01 06:56:57 +0800 |
commit | e19d753cc6966fee48f376addff6aae688a8c808 (patch) | |
tree | 4e97c01dd0b22bcc3909983753c6db585a0e6376 /mail/milter-greylist/files | |
parent | 460df9ccfb92b2606f6aae199b81048c2297a2a1 (diff) | |
download | freebsd-ports-graphics-e19d753cc6966fee48f376addff6aae688a8c808.tar.gz freebsd-ports-graphics-e19d753cc6966fee48f376addff6aae688a8c808.tar.zst freebsd-ports-graphics-e19d753cc6966fee48f376addff6aae688a8c808.zip |
- Fix crash upon configuration reload
PR: ports/67419
Submitted by: Cyril Guibourg <aragorn+ports@teaser.fr> (maintainer)
Obtained from: author
Diffstat (limited to 'mail/milter-greylist/files')
-rw-r--r-- | mail/milter-greylist/files/patch-conf.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/mail/milter-greylist/files/patch-conf.c b/mail/milter-greylist/files/patch-conf.c new file mode 100644 index 00000000000..87658b33671 --- /dev/null +++ b/mail/milter-greylist/files/patch-conf.c @@ -0,0 +1,71 @@ +--- conf.c.orig Fri Apr 2 17:06:52 2004 ++++ conf.c Mon May 31 16:58:06 2004 +@@ -34,7 +34,7 @@ + #ifdef HAVE_SYS_CDEFS_H + #include <sys/cdefs.h> + #ifdef __RCSID +-__RCSID("$Id: conf.c,v 1.15 2004/04/02 15:06:52 manu Exp $"); ++__RCSID("$Id: conf.c,v 1.15 (sigsev patch) 2004/04/02 15:06:52 manu Exp $"); + #endif + #endif + +@@ -83,6 +83,8 @@ + conf_load(void) /* exceptlist must be write-locked */ + { + FILE *stream; ++ pthread_t tid; ++ pthread_attr_t attr; + + /* + * Reset the configuration to its default +@@ -100,8 +102,49 @@ + return; + } + ++ /* ++ * On some platforms, the thread stack limit is too low and ++ * conf_parse will get a SIGSEGV because it overflows the ++ * stack. ++ * ++ * In order to fix this, we spawn a new thread just for ++ * parsing the config file, and we request a stack big ++ * enough to hold the parser data. 2 MB seems okay. ++ */ ++ + conf_in = stream; +- conf_parse(); ++ ++ if (pthread_attr_init(&attr) != 0) { ++ syslog(LOG_ERR, "pthread_attr_init failed: %s", ++ strerror(errno)); ++ exit(EX_OSERR); ++ } ++ ++ if (pthread_attr_setstacksize(&attr, 2 * 1024 * 1024) != 0) { ++ syslog(LOG_ERR, "pthread_attr_setstacksize failed: %s", ++ strerror(errno)); ++ exit(EX_OSERR); ++ } ++ ++ if (pthread_create(&tid, &attr, ++ (void *(*)(void *))conf_parse, NULL) != 0) { ++ syslog(LOG_ERR, "pthread_create failed: %s", ++ strerror(errno)); ++ exit(EX_OSERR); ++ } ++ ++ if (pthread_join(tid, NULL) != 0) { ++ syslog(LOG_ERR, "pthread_join failed: %s", ++ strerror(errno)); ++ exit(EX_OSERR); ++ } ++ ++ if (pthread_attr_destroy(&attr) != 0) { ++ syslog(LOG_ERR, "pthread_attr_destroy failed: %s", ++ strerror(errno)); ++ exit(EX_OSERR); ++ } ++ + fclose(stream); + + (void)gettimeofday(&conffile_modified, NULL); |