Transport filter timeout fix. Fixes: #898
authorNigel Metheringham <nigel@exim.org>
Thu, 5 Nov 2009 19:28:10 +0000 (19:28 +0000)
committerNigel Metheringham <nigel@exim.org>
Thu, 5 Nov 2009 19:28:10 +0000 (19:28 +0000)
doc/doc-txt/ChangeLog
src/src/transports/pipe.c

index 8e6d5b0c42322159081742f24d5e35aad8cc3fa9..9803382dc0b250b0f13282f57c2c2d4dfbca4192 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.585 2009/10/30 15:14:04 nm4 Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.586 2009/11/05 19:31:15 nm4 Exp $
 
 Change log file for Exim from version 4.21
 -------------------------------------------
@@ -142,6 +142,9 @@ NM/31 Bugzilla 896: Dovecot buffer overrun fix
 NM/32 Bugzilla 889: Change all instances of "expr" in shell scripts to "expr --"
       Unlike the original bugzilla I have changed all shell scripts in src tree
 
+NM/33 Bugzilla 898: Transport filter timeout fix
+      Patch by Todd Rinaldo
+
 
 Exim version 4.69
 -----------------
index 3021194aed68e8d3687eec2bbaac741a17029098..bbba305b09d95d377239c94ad7794a47d2902a71 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/transports/pipe.c,v 1.12 2007/01/08 10:50:20 ph10 Exp $ */
+/* $Cambridge: exim/src/src/transports/pipe.c,v 1.13 2009/11/05 19:28:10 nm4 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -924,6 +924,18 @@ if ((rc = child_close(pid, timeout)) != 0)
       "transport: %s%s", tblock->name, strerror(errno), tmsg);
     }
 
+  /* Since the transport_filter timed out we assume it has sent the child process
+  a malformed or incomplete data stream.  Kill off the child process
+  and prevent checking its exit status as it will has probably exited in error.
+  This prevents the transport_filter timeout message from getting overwritten
+  by the exit error which is not the cause of the problem. */
+
+  else if (transport_filter_timed_out)
+    {
+    killpg(pid, SIGKILL);
+    kill(outpid, SIGKILL);
+    }
+
   /* Either the process completed, but yielded a non-zero (necessarily
   positive) status, or the process was terminated by a signal (rc will contain
   the negation of the signal number). Treat killing by signal as failure unless