From 05065d99c78a53f6ab97086574a01d75be79decc Mon Sep 17 00:00:00 2001 From: Pav Lucistnik Date: Mon, 18 Jul 2005 16:04:16 +0000 Subject: - Patch nine bugs: #79 - INTERNALDATE reponses do not conform to RFC #145 - LMTP loses return-path #177 - Compile Fails on FreeBSD (fixes compilation on FreeBSD 4.X) #184 - socklen_t issue #190 - huge load if database crash #198 - DBMail processes killing each other #199 - spare child creates zombie #214 - dbmail-smtp dumps core with double free #216 - malformed header prevents delivery - Fix RC_SUBR usage PR: ports/83437, also ports/80736, ports/82437, ports/83575 Submitted by: Mark Starovoytov , parts also by: Radim Kolar , thompsa, Marcus Grando Approved by: maintainer timeout (2 months on oldest PR) --- mail/dbmail-devel/files/patch-2.0.4_bug190_pool.c | 126 ++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 mail/dbmail-devel/files/patch-2.0.4_bug190_pool.c (limited to 'mail/dbmail-devel/files/patch-2.0.4_bug190_pool.c') diff --git a/mail/dbmail-devel/files/patch-2.0.4_bug190_pool.c b/mail/dbmail-devel/files/patch-2.0.4_bug190_pool.c new file mode 100644 index 000000000000..562c0cb23688 --- /dev/null +++ b/mail/dbmail-devel/files/patch-2.0.4_bug190_pool.c @@ -0,0 +1,126 @@ +Index: pool.c +=================================================================== +--- pool.c (revision 1600) ++++ pool.c (revision 1758) +@@ -73,8 +73,10 @@ + void scoreboard_new(serverConfig_t * conf) + { + int serr; +- if ((shmid = shmget(IPC_PRIVATE, P_SIZE, 0644 | IPC_CREAT)) == -1) +- trace(TRACE_FATAL, "%s,%s: shmget failed",__FILE__,__func__); ++ if ((shmid = shmget(IPC_PRIVATE, P_SIZE, 0644 | IPC_CREAT)) == -1) { ++ serr = errno; ++ trace(TRACE_FATAL, "%s,%s: shmget failed [%s]",__FILE__,__func__, strerror(serr)); ++ } + scoreboard = shmat(shmid, (void *) 0, 0); + serr=errno; + if (scoreboard == (Scoreboard_t *) (-1)) { +@@ -222,7 +236,7 @@ + } + scoreboard_unlck(); + trace(TRACE_FATAL, +- "%s,%s: pid NOT found on scoreboard [%d]", __FILE__, __FUNCTION__, pid); ++ "%s,%s: pid NOT found on scoreboard [%d]", __FILE__, __func__, pid); + return -1; + } + +@@ -238,25 +252,25 @@ + { + int i; + trace(TRACE_MESSAGE, "%s,%s: register child [%d]", +- __FILE__, __FUNCTION__, getpid()); ++ __FILE__, __func__, getpid()); + + scoreboard_wrlck(); + for (i = 0; i < scoreboard->conf->maxChildren; i++) { + if (scoreboard->child[i].pid == -1) + break; + if (scoreboard->child[i].pid == getpid()) { +- trace(TRACE_ERROR, ++ scoreboard_unlck(); ++ trace(TRACE_FATAL, + "%s,%s: child already registered.", +- __FILE__, __FUNCTION__); +- scoreboard_unlck(); ++ __FILE__, __func__); + return -1; + } + } + if (i == scoreboard->conf->maxChildren) { ++ scoreboard_unlck(); + trace(TRACE_WARNING, + "%s,%s: no empty slot found", +- __FILE__, __FUNCTION__); +- scoreboard_unlck(); ++ __FILE__, __func__); + return -1; + } + +@@ -264,8 +278,8 @@ + scoreboard->child[i].status = STATE_IDLE; + scoreboard_unlck(); + +- trace(TRACE_INFO, "%s,%s: initializing child_state [%d] using slot [%d]", +- __FILE__, __FUNCTION__, getpid(), i); ++ trace(TRACE_MESSAGE, "%s,%s: initializing child_state [%d] using slot [%d]", ++ __FILE__, __func__, getpid(), i); + return 0; + } + +@@ -281,7 +295,7 @@ + scoreboard->child[key].status = STATE_CONNECTED; + scoreboard_unlck(); + +- trace(TRACE_DEBUG, "%s,%s: [%d]", __FILE__, __FUNCTION__, ++ trace(TRACE_DEBUG, "%s,%s: [%d]", __FILE__, __func__, + getpid()); + } + +@@ -297,7 +311,7 @@ + scoreboard->child[key].status = STATE_IDLE; + scoreboard_unlck(); + +- trace(TRACE_DEBUG, "%s,%s: [%d]", __FILE__, __FUNCTION__, ++ trace(TRACE_DEBUG, "%s,%s: [%d]", __FILE__, __func__, + getpid()); + } + +@@ -320,7 +334,7 @@ + scoreboard_unlck(); + + trace(TRACE_MESSAGE, +- "%s,%s: child [%d] unregistered", __FILE__, __FUNCTION__, ++ "%s,%s: child [%d] unregistered", __FILE__, __func__, + getpid()); + } + +@@ -346,7 +360,7 @@ + manage_stop_children(); + trace(TRACE_FATAL, + "%s,%s: could not create children. Fatal.", +- __FILE__, __FUNCTION__); ++ __FILE__, __func__); + exit(0); + } + } +@@ -360,10 +374,17 @@ + if (chpid == -1) + continue; + if (waitpid(chpid, NULL, WNOHANG|WUNTRACED) == chpid) { ++ scoreboard_release(chpid); + trace(TRACE_MESSAGE,"%s,%s: child [%d] exited. Restarting...", +- __FILE__, __FUNCTION__, chpid); +- scoreboard_release(chpid); +- CreateChild(&childinfo); ++ __FILE__, __func__, chpid); ++ if (CreateChild(&childinfo)== -1) { ++ trace(TRACE_ERROR,"%s,%s: createchild failed. Bailout...", ++ __FILE__, __func__); ++ GeneralStopRequested=1; ++ manage_stop_children(); ++ ++ exit(1); ++ } + } + } + sleep(1); -- cgit v1.2.3