aboutsummaryrefslogtreecommitdiff
path: root/mail/milter-greylist/files/patch-conf.c
blob: 87658b336712a16e1bbb3bbbb3cf2a350816aca4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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);