[Exim] [Fwd: Bug#222068: exim: application bug: exim(429) ha…

Kezdőlap
Üzenet törlése
Válasz az üzenetre
Szerző: Mark Baker
Dátum:  
Címzett: exim-users
Tárgy: [Exim] [Fwd: Bug#222068: exim: application bug: exim(429) has SIGCHLD set to SIG_IGN but calls wait().]
This is a multi-part message in MIME format.
--

--
Reply-To: Piotr Roszatycki <Piotr_Roszatycki@???>,
    222068@???
Resent-From: Piotr Roszatycki <Piotr_Roszatycki@???>
Resent-To: debian-bugs-dist@???
Resent-CC: Mark Baker <mbaker@???>
Resent-Date: Tue, 25 Nov 2003 14:03:01 UTC
Resent-Message-ID: <handler.222068.B.106976825825601@???>
Date: Tue, 25 Nov 2003 14:49:23 +0100
From: Piotr Roszatycki <Piotr_Roszatycki@???>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.5) Gecko/20031105 Thunderbird/0.3
To: submit@???
Delivered-To: submit@???
Resent-Sender: Debian BTS <debbugs@???>
Resent-Date: Tue, 25 Nov 2003 14:55:36 +0000
Subject: Bug#222068: exim: application bug: exim(429) has SIGCHLD set to SIG_IGN but calls wait().


This is a multi-part message in MIME format.
--
Package: exim
Version: 3.35-1woody2
Severity: important
Tags: patch

Exim produces a lot of messages. I.e.:

Nov 25 13:35:12 szafir kernel: application bug: exim(24490) has SIGCHLD
set to SIG_IGN but calls wa
it().
Nov 25 13:35:13 szafir kernel: (see the NOTES section of 'man 2 wait').
Workaround activated.
Nov 25 13:36:15 szafir kernel: application bug: exim(25506) has SIGCHLD
set to SIG_IGN but calls wa
it().
Nov 25 13:36:15 szafir kernel: (see the NOTES section of 'man 2 wait').
Workaround activated.

This is because exim sets SIG_IGN on SIGCHLD signal and this is error
for Linux kernel.

The attached patch tries to fix the bug.

See also:

http://www.exim.org/pipermail/exim-users/Week-of-Mon-20030414/052632.html


-- System Information
Debian Release: 3.0
Architecture: i386
Kernel: Linux granat 2.4.22pre1-redhat-4.0.1.el-pentiumiii-smp #1 SMP
Tue Nov 18 12:37:43 CET 2003 i686
Locale: LANG=pl_PL, LC_CTYPE=pl_PL

Versions of packages exim depends on:
ii  cron                         3.0pl1-72   management of regular
background p
ii  libc6                        2.2.5-11.5  GNU C Library: Shared
libraries an
ii  libdb2                       2:2.7.7.0-7 The Berkeley database
routines (ru
ii  libident                     0.22-2      simple RFC1413 client
library - ru
ii  libldap2                     2.0.23-6.3  OpenLDAP libraries.
ii  libpam0g                     0.72-35     Pluggable Authentication
Modules l
ii  libpcre3                     3.4-1.1     Philip Hazel's Perl
Compatible Reg


--
Piotr Roszatycki, Netia Telekom S.A.                    .''`.
mailto:Piotr_Roszatycki@netia.net.pl                   : :' :
mailto:dexter@debian.org                               `. `'
                                                          `-
--
--- exim-3.35.orig/src/daemon.c
+++ exim-3.35/src/daemon.c
@@ -274,7 +274,9 @@
   want to wait for them as they are doing independent deliveries. */


for (i = 0; i < listen_socket_count; i++) close(listen_sockets[i]);
+#ifdef CAN_IGNORE_SIGCHLD
signal(SIGCHLD, SIG_IGN);
+#endif

/* Attempt to get an id from the sending machine via the RFC 1413
protocol. We do this in the sub-process in order not to hold up the
--- exim-3.35.orig/src/exim.c
+++ exim-3.35/src/exim.c
@@ -3141,7 +3186,9 @@
in the non-synchronous delivery case. However, it seems that on some OS, this
doesn't work, so the loop below contains a waitpid() just in case. */

+#ifdef CAN_IGNORE_SIGCHLD
if (!synchronous_delivery) signal(SIGCHLD, SIG_IGN);
+#endif

 /* Save the current store pool point, for resetting at the start of
 each message, and save the real sender address, if any. */
--- exim-3.35.orig/src/smtp_in.c
+++ exim-3.35/src/smtp_in.c
@@ -3497,7 +3496,9 @@
       forking. It should be set that way anyway for external incoming SMTP,
       but we save and restore to be tidy. */


+#ifdef CAN_IGNORE_SIGCHLD
       oldsignal = signal(SIGCHLD, SIG_IGN);
+#endif


       if ((pid = fork()) == 0)
         {
@@ -3520,7 +3521,9 @@
         _exit(EXIT_FAILURE);         /* paranoia */
         }


+#ifdef CAN_IGNORE_SIGCHLD
       signal(SIGCHLD, oldsignal);    /* restore */
+#endif
       }


     if (pid < 0)
--



--