Check for lost connection or unexpected input at end of message.
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Fri, 13 Apr 2007 15:13:47 +0000 (15:13 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Fri, 13 Apr 2007 15:13:47 +0000 (15:13 +0000)
28 files changed:
doc/doc-txt/ChangeLog
src/src/functions.h
src/src/globals.c
src/src/globals.h
src/src/receive.c
src/src/smtp_in.c
src/src/tls-gnu.c
src/src/tls-openssl.c
src/src/tls.c
test/confs/0559 [new file with mode: 0644]
test/confs/2029 [new file with mode: 0644]
test/confs/2150 [new file with mode: 0644]
test/log/0559 [new file with mode: 0644]
test/log/2029 [new file with mode: 0644]
test/log/2150 [new file with mode: 0644]
test/scripts/0000-Basic/0300
test/scripts/0000-Basic/0301
test/scripts/0000-Basic/0559 [new file with mode: 0644]
test/scripts/2000-GnuTLS/2029 [new file with mode: 0644]
test/scripts/2100-OpenSSL/2150 [new file with mode: 0644]
test/stderr/0559 [new file with mode: 0644]
test/stderr/2029 [new file with mode: 0644]
test/stderr/2150 [new file with mode: 0644]
test/stdout/0300
test/stdout/0301
test/stdout/0559 [new file with mode: 0644]
test/stdout/2029 [new file with mode: 0644]
test/stdout/2150 [new file with mode: 0644]

index 5f19828820ee5097c48f0f7a409ddb6b95eebd26..4a8d41d6657c8427580dfa9c08c449d4098540d0 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.501 2007/04/12 09:00:51 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.502 2007/04/13 15:13:47 ph10 Exp $
 
 Change log file for Exim from version 4.21
 -------------------------------------------
@@ -202,6 +202,16 @@ SC/03 Eximstats - V1.58 Fix to get <> and blackhole to show in edomain tables.
 
 PH/43 Yet another patch from the Sieve maintainer.
 
+PH/44 I found a way to check for a TCP/IP connection going away before sending
+      the response to the final '.' that terminates a message. At this time,
+      there should not be any pending input - the client should be waiting for
+      the response. Therefore, a select() can be used: if it shows that the
+      input is "ready", there is either input waiting, or the socket has been
+      closed. Both cases are errors. (It's a bit more complicated than this
+      because of buffering, but that's the essence of it.) Previously, Exim
+      would have sent an OK response which the client would never have see.
+      This could lead to message repetition. This fix should cure that.
+
 
 Exim version 4.66
 -----------------
index 55a2e22d329e2a22ea019ca44074d9a9e9b155b0..d6262d1a73ed65dfcf2fac66f758e479557e4331 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/functions.h,v 1.36 2007/02/07 11:24:56 ph10 Exp $ */
+/* $Cambridge: exim/src/src/functions.h,v 1.37 2007/04/13 15:13:47 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -32,6 +32,7 @@ extern int     tls_ferror(void);
 extern int     tls_getc(void);
 extern int     tls_read(uschar *, size_t);
 extern int     tls_server_start(uschar *, uschar *, uschar *, uschar *);
+extern BOOL    tls_smtp_buffered(void);
 extern int     tls_ungetc(int);
 extern int     tls_write(const uschar *, size_t);
 #endif
@@ -261,6 +262,7 @@ extern void    sha1_start(sha1 *);
 extern int     sieve_interpret(uschar *, int, uschar *, uschar *, uschar *,
                  address_item **, uschar **);
 extern void    sigalrm_handler(int);
+extern BOOL    smtp_buffered(void);
 extern void    smtp_closedown(uschar *);
 extern int     smtp_connect(host_item *, int, int, uschar *, int, BOOL);
 extern int     smtp_feof(void);
index 5f4ed83fdd6f0ef76a20075afff593714f27b4de..83c37b09ed1063c0e4137def607e4f9f79525d58 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/globals.c,v 1.71 2007/02/06 12:19:27 ph10 Exp $ */
+/* $Cambridge: exim/src/src/globals.c,v 1.72 2007/04/13 15:13:47 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -136,6 +136,7 @@ int (*receive_getc)(void)      = stdin_getc;
 int (*receive_ungetc)(int)     = stdin_ungetc;
 int (*receive_feof)(void)      = stdin_feof;
 int (*receive_ferror)(void)    = stdin_ferror;
+BOOL (*receive_smtp_buffered)(void) = NULL;   /* Only used for SMTP */
 #endif
 
 
index 48b4e0ecc9fc44b920019904ed8cddc260c05a62..8dbb41379bf35bc807580f9377b8cfc9f9d30d4e 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/globals.h,v 1.51 2007/02/06 12:19:27 ph10 Exp $ */
+/* $Cambridge: exim/src/src/globals.h,v 1.52 2007/04/13 15:13:47 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -96,6 +96,7 @@ extern int (*receive_getc)(void);
 extern int (*receive_ungetc)(int);
 extern int (*receive_feof)(void);
 extern int (*receive_ferror)(void);
+extern BOOL (*receive_smtp_buffered)(void);
 
 
 /* For clearing, saving, restoring address expansion variables. We have to have
index f6d294e6de0e82521507d12edc70017bfcdadca6..98a728b2fcbe49422aaff04c70b5663ea210ff9a 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/receive.c,v 1.35 2007/04/12 09:03:19 ph10 Exp $ */
+/* $Cambridge: exim/src/src/receive.c,v 1.36 2007/04/13 15:13:47 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -3081,7 +3081,7 @@ if (local_scan_data != NULL)
 
 if (rc == LOCAL_SCAN_ACCEPT_FREEZE)
   {
-  if (!deliver_freeze)      /* ACL might have already frozen */
+  if (!deliver_freeze)         /* ACL might have already frozen */
     {
     deliver_freeze = TRUE;
     deliver_frozen_at = time(NULL);
@@ -3380,22 +3380,6 @@ not put the zero in. */
 
 s[sptr] = 0;
 
-/* While writing to the log, set a flag to cause a call to receive_bomb_out()
-if the log cannot be opened. */
-
-receive_call_bombout = TRUE;
-log_write(0, LOG_MAIN |
-  (((log_extra_selector & LX_received_recipients) != 0)? LOG_RECIPIENTS : 0) |
-  (((log_extra_selector & LX_received_sender) != 0)? LOG_SENDER : 0),
-  "%s", s);
-receive_call_bombout = FALSE;
-
-/* Log any control actions taken by an ACL or local_scan(). */
-
-if (deliver_freeze) log_write(0, LOG_MAIN, "frozen by %s", frozen_by);
-if (queue_only_policy) log_write(L_delay_delivery, LOG_MAIN,
-  "no immediate delivery: queued by %s", queued_by);
-
 /* Create a message log file if message logs are being used and this message is
 not blackholed. Write the reception stuff to it. We used to leave message log
 creation until the first delivery, but this has proved confusing for somep
@@ -3446,6 +3430,94 @@ if (message_logs && blackholed_by == NULL)
     }
   }
 
+/* Everything has now been done for a successful message except logging its
+arrival, and outputting an SMTP response. While writing to the log, set a flag
+to cause a call to receive_bomb_out() if the log cannot be opened. */
+
+receive_call_bombout = TRUE;
+
+/* Before sending an SMTP response in a TCP/IP session, we check to see if
+there is unconsumed input (which there shouldn't be) or if the connection has
+gone away. This can be done because the end of a message is always a
+synchronization point. If the connection is still present, but there is no
+pending input, the result of a select() call will be zero. If, however, the
+connection has gone away, or if there is pending input, the result of select()
+will be non-zero. The two cases can be distinguished by trying to read the next
+input character. Of course, since TCP/IP is asynchronous, there is always a
+chance that the connection will vanish between the time of this test and the
+sending of the response, but the chance of this happening should be small.
+
+We also check for input that has already been received and is in the local
+input buffer (plain SMTP or TLS) by calling receive_smtp_buffered(). */
+
+if (smtp_input && sender_host_address != NULL && !sender_host_notsocket)
+  {
+  struct timeval tv;
+  fd_set select_check;
+  FD_ZERO(&select_check);
+  FD_SET(fileno(smtp_in), &select_check);
+  tv.tv_sec = 0;
+  tv.tv_usec = 0;
+
+  if (select(fileno(smtp_in) + 1, &select_check, NULL, NULL, &tv) != 0 ||
+      receive_smtp_buffered())
+    {
+    uschar *msg;
+    if ((RECEIVE_GETC)() == EOF)
+      {
+      msg = US"SMTP connection lost after final dot";
+      smtp_reply = US"";   /* No attempt to send a response */
+      }
+    else
+      {
+      msg = US"Synchronization error (data after final dot)";
+      smtp_reply = US"550 Synchronization error (data after final dot)";
+      }
+
+    /* Overwrite the log line workspace */
+
+    sptr = 0;
+    s = string_cat(s, &size, &sptr, msg, Ustrlen(msg));
+    s = add_host_info_for_log(s, &size, &sptr);
+    s[sptr] = 0;
+    log_write(0, LOG_MAIN, "%s", s);
+
+    /* We now have to delete the files for this aborted message. */
+
+    sprintf(CS spool_name, "%s/input/%s/%s-D", spool_directory, message_subdir,
+      message_id);
+    Uunlink(spool_name);
+
+    sprintf(CS spool_name, "%s/input/%s/%s-H", spool_directory, message_subdir,
+      message_id);
+    Uunlink(spool_name);
+
+    sprintf(CS spool_name, "%s/msglog/%s/%s", spool_directory, message_subdir,
+      message_id);
+    Uunlink(spool_name);
+
+    /* Do not accept any more messages on this connection. */
+
+    smtp_yield = FALSE;
+    goto TIDYUP;
+    }
+  }
+
+/* The connection has not gone away; we really are going to take responsibility
+for this message. */
+
+log_write(0, LOG_MAIN |
+  (((log_extra_selector & LX_received_recipients) != 0)? LOG_RECIPIENTS : 0) |
+  (((log_extra_selector & LX_received_sender) != 0)? LOG_SENDER : 0),
+  "%s", s);
+receive_call_bombout = FALSE;
+
+/* Log any control actions taken by an ACL or local_scan(). */
+
+if (deliver_freeze) log_write(0, LOG_MAIN, "frozen by %s", frozen_by);
+if (queue_only_policy) log_write(L_delay_delivery, LOG_MAIN,
+  "no immediate delivery: queued by %s", queued_by);
+
 store_reset(s);   /* The store for the main log message can be reused */
 
 /* If the message is frozen, and freeze_tell is set, do the telling. */
@@ -3460,9 +3532,9 @@ if (deliver_freeze && freeze_tell != NULL && freeze_tell[0] != 0)
 
 /* Either a message has been successfully received and written to the two spool
 files, or an error in writing the spool has occurred for an SMTP message, or
-an SMTP message has been rejected because of a bad sender. (For a non-SMTP
-message we will have already given up because there's no point in carrying on!)
-In either event, we must now close (and thereby unlock) the data file. In the
+an SMTP message has been rejected for policy reasons. (For a non-SMTP message
+we will have already given up because there's no point in carrying on!) In
+either event, we must now close (and thereby unlock) the data file. In the
 successful case, this leaves the message on the spool, ready for delivery. In
 the error case, the spool file will be deleted. Then tidy up store, interact
 with an SMTP call if necessary, and return.
@@ -3491,9 +3563,9 @@ if (smtp_input)
   yield = smtp_yield;
 
   /* Handle interactive SMTP callers. After several kinds of error, smtp_reply
-  is set to the response. However, after an ACL error or local_scan() error,
-  the response has already been sent, and smtp_reply is an empty string to
-  indicate this. */
+  is set to the response that should be sent. When it is NULL, we generate
+  default responses. After an ACL error or local_scan() error, the response has
+  already been sent, and smtp_reply is an empty string to indicate this. */
 
   if (!smtp_batched_input)
     {
@@ -3522,7 +3594,7 @@ if (smtp_input)
           "\n**** SMTP testing: that is not a real message id!\n\n");
       }
 
-    /* smtp_reply was previously set */
+    /* smtp_reply is set non-empty */
 
     else if (smtp_reply[0] != 0)
       {
index bdac07be7bf5a6a3ac7640af07606c58f0e0c6d9..dc96a9aa186541c37004774c31d3500fbe4aaddc 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/smtp_in.c,v 1.56 2007/03/21 15:10:39 ph10 Exp $ */
+/* $Cambridge: exim/src/src/smtp_in.c,v 1.57 2007/04/13 15:13:47 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -333,6 +333,23 @@ return smtp_had_error;
 
 
 
+/*************************************************
+*      Test for characters in the SMTP buffer    *
+*************************************************/
+
+/* Used at the end of a message
+
+Arguments:     none
+Returns:       TRUE/FALSE
+*/
+
+BOOL
+smtp_buffered(void)
+{
+return smtp_inptr < smtp_inend;
+}
+
+
 
 /*************************************************
 *     Write formatted string to SMTP channel     *
@@ -1378,6 +1395,7 @@ receive_getc = smtp_getc;
 receive_ungetc = smtp_ungetc;
 receive_feof = smtp_feof;
 receive_ferror = smtp_ferror;
+receive_smtp_buffered = smtp_buffered;
 smtp_inptr = smtp_inend = smtp_inbuffer;
 smtp_had_eof = smtp_had_error = 0;
 
index ee57659fa7bf174f86d1c0e0c35b21159cc51ac8..e66c2e448b767aa35332553616bfd2152c4c51ef 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/tls-gnu.c,v 1.18 2007/01/18 15:35:42 ph10 Exp $ */
+/* $Cambridge: exim/src/src/tls-gnu.c,v 1.19 2007/04/13 15:13:47 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -976,6 +976,7 @@ receive_getc = tls_getc;
 receive_ungetc = tls_ungetc;
 receive_feof = tls_feof;
 receive_ferror = tls_ferror;
+receive_smtp_buffered = tls_smtp_buffered;
 
 tls_active = fileno(smtp_out);
 
@@ -1174,6 +1175,7 @@ if (ssl_xfer_buffer_lwm >= ssl_xfer_buffer_hwm)
     receive_ungetc = smtp_ungetc;
     receive_feof = smtp_feof;
     receive_ferror = smtp_ferror;
+    receive_smtp_buffered = smtp_buffered;
 
     gnutls_deinit(tls_session);
     tls_session = NULL;
index 85f4e15fec3808c0d28cdafa1fb9c010f310b784..a9b67dcdd3876e1bdb537febecba522a701ef99a 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/tls-openssl.c,v 1.11 2007/03/13 09:50:22 ph10 Exp $ */
+/* $Cambridge: exim/src/src/tls-openssl.c,v 1.12 2007/04/13 15:13:47 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -733,6 +733,7 @@ receive_getc = tls_getc;
 receive_ungetc = tls_ungetc;
 receive_feof = tls_feof;
 receive_ferror = tls_ferror;
+receive_smtp_buffered = tls_smtp_buffered;
 
 tls_active = fileno(smtp_out);
 return OK;
@@ -886,6 +887,7 @@ if (ssl_xfer_buffer_lwm >= ssl_xfer_buffer_hwm)
     receive_ungetc = smtp_ungetc;
     receive_feof = smtp_feof;
     receive_ferror = smtp_ferror;
+    receive_smtp_buffered = smtp_buffered;
 
     SSL_free(ssl);
     ssl = NULL;
index e76a970205cbc926016e3a0fb499ef037ac9a2ba..f1583f2319bc0651da12d8200470f2525c32057a 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/tls.c,v 1.4 2007/01/08 10:50:18 ph10 Exp $ */
+/* $Cambridge: exim/src/src/tls.c,v 1.5 2007/04/13 15:13:47 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -147,6 +147,24 @@ tls_ferror(void)
 return ssl_xfer_error;
 }
 
+
+/*************************************************
+*           TLS version of smtp_buffered         *
+*************************************************/
+
+/* Tests for unused chars in the TLS input buffer.
+
+Arguments:     none
+Returns:       TRUE/FALSE
+*/
+
+BOOL
+tls_smtp_buffered(void)
+{
+return ssl_xfer_buffer_lwm < ssl_xfer_buffer_hwm;
+}
+
+
 #endif  /* SUPPORT_TLS */
 
 /* End of tls.c */
diff --git a/test/confs/0559 b/test/confs/0559
new file mode 100644 (file)
index 0000000..c148d9e
--- /dev/null
@@ -0,0 +1,28 @@
+# Exim test configuration 0559
+
+exim_path = EXIM_PATH
+host_lookup_order = bydns
+primary_hostname = myhost.test.ex
+rfc1413_query_timeout = 0s
+spool_directory = DIR/spool
+log_file_path = DIR/spool/log/%slog
+gecos_pattern = ""
+gecos_name = CALLER_NAME
+
+# ----- Main settings -----
+
+acl_smtp_rcpt = accept
+acl_smtp_data = check_data
+
+queue_only
+
+
+# ----- ACLs -----
+
+begin acl
+
+check_data:
+  accept delay = 1s
+
+
+# End
diff --git a/test/confs/2029 b/test/confs/2029
new file mode 100644 (file)
index 0000000..1d691be
--- /dev/null
@@ -0,0 +1,32 @@
+# Exim test configuration 2029
+
+exim_path = EXIM_PATH
+host_lookup_order = bydns
+primary_hostname = myhost.test.ex
+rfc1413_query_timeout = 0s
+spool_directory = DIR/spool
+log_file_path = DIR/spool/log/%slog
+gecos_pattern = ""
+gecos_name = CALLER_NAME
+
+# ----- Main settings -----
+
+acl_smtp_rcpt = accept
+acl_smtp_data = check_data
+
+queue_only
+
+tls_advertise_hosts = *
+
+tls_certificate = DIR/aux-fixed/cert1
+tls_privatekey = DIR/aux-fixed/cert1
+
+# ----- ACLs -----
+
+begin acl
+
+check_data:
+  accept delay = 1s
+
+
+# End
diff --git a/test/confs/2150 b/test/confs/2150
new file mode 100644 (file)
index 0000000..015947b
--- /dev/null
@@ -0,0 +1,32 @@
+# Exim test configuration 2150
+
+exim_path = EXIM_PATH
+host_lookup_order = bydns
+primary_hostname = myhost.test.ex
+rfc1413_query_timeout = 0s
+spool_directory = DIR/spool
+log_file_path = DIR/spool/log/%slog
+gecos_pattern = ""
+gecos_name = CALLER_NAME
+
+# ----- Main settings -----
+
+acl_smtp_rcpt = accept
+acl_smtp_data = check_data
+
+queue_only
+
+tls_advertise_hosts = *
+
+tls_certificate = DIR/aux-fixed/cert1
+tls_privatekey = DIR/aux-fixed/cert1
+
+# ----- ACLs -----
+
+begin acl
+
+check_data:
+  accept delay = 1s
+
+
+# End
diff --git a/test/log/0559 b/test/log/0559
new file mode 100644 (file)
index 0000000..077691e
--- /dev/null
@@ -0,0 +1,4 @@
+1999-03-02 09:44:33 exim x.yz daemon started: pid=pppp, no queue runs, listening for SMTP on port 1225
+1999-03-02 09:44:33 10HmaX-0005vi-00 SMTP connection lost after final dot H=(abcd) [127.0.0.1] P=esmtp
+1999-03-02 09:44:33 exim x.yz daemon started: pid=pppp, no queue runs, listening for SMTP on port 1225
+1999-03-02 09:44:33 10HmaY-0005vi-00 Synchronization error (data after final dot) H=(abcd) [127.0.0.1] P=esmtp
diff --git a/test/log/2029 b/test/log/2029
new file mode 100644 (file)
index 0000000..737b697
--- /dev/null
@@ -0,0 +1,5 @@
+1999-03-02 09:44:33 exim x.yz daemon started: pid=pppp, no queue runs, listening for SMTP on port 1225
+1999-03-02 09:44:33 10HmaX-0005vi-00 TLS recv error on connection from [127.0.0.1]: A TLS packet with unexpected length was received.
+1999-03-02 09:44:33 10HmaX-0005vi-00 SMTP connection lost after final dot H=[127.0.0.1] P=smtps
+1999-03-02 09:44:33 exim x.yz daemon started: pid=pppp, no queue runs, listening for SMTP on port 1225
+1999-03-02 09:44:33 10HmaY-0005vi-00 Synchronization error (data after final dot) H=[127.0.0.1] P=smtps
diff --git a/test/log/2150 b/test/log/2150
new file mode 100644 (file)
index 0000000..41ada44
--- /dev/null
@@ -0,0 +1,4 @@
+1999-03-02 09:44:33 exim x.yz daemon started: pid=pppp, no queue runs, listening for SMTP on port 1225
+1999-03-02 09:44:33 10HmaX-0005vi-00 SMTP connection lost after final dot H=[127.0.0.1] P=smtps
+1999-03-02 09:44:33 exim x.yz daemon started: pid=pppp, no queue runs, listening for SMTP on port 1225
+1999-03-02 09:44:33 10HmaY-0005vi-00 Synchronization error (data after final dot) H=[127.0.0.1] P=smtps
index 053aec80422fa57eda26c634b1db7a1b94558456..de3be10956feaa17b0e8045a57cbfc76d394a060 100644 (file)
@@ -23,8 +23,9 @@ rset\r\nmail from:<userx@test.ex>\r\nrcpt to:<userx@test.ex>\r\ndata
 ??? 250
 ??? 354
 the message
-.\r\nmail from:<userx@test.ex>
+.
 +++ 1
+mail from:<userx@test.ex>
 rcpt to:<userx@test.ex>\r\ndata\r\nthe message\r\nsecond line
 ??? 250
 ??? 250
index 4add8f42ceb1de393f2243985c8c22a7a72a37dc..f84244f05dbd16480a60da130f6e2bdd9b0cd785 100644 (file)
@@ -26,8 +26,9 @@ mail from:<userx@test.ex>\r\nrcpt to:<userx@test.ex>\r\ndata
 ??? 250
 ??? 354
 the message
-.\r\nmail from:<userx@test.ex>\r\nrcpt to:<userx@test.ex>\r\ndata\r\nthe message
+.
 ??? 250
+mail from:<userx@test.ex>\r\nrcpt to:<userx@test.ex>\r\ndata\r\nthe message
 ??? 250
 ??? 250
 ??? 354
diff --git a/test/scripts/0000-Basic/0559 b/test/scripts/0000-Basic/0559
new file mode 100644 (file)
index 0000000..01d7d99
--- /dev/null
@@ -0,0 +1,44 @@
+# SMTP still alive check before final response
+need_ipv4
+#
+exim -DSERVER=server -bd -oX PORT_D
+****
+client -t5 127.0.0.1 PORT_D
+??? 220
+ehlo abcd
+??? 250-
+??? 250-
+??? 250-
+??? 250
+mail from:<userx@test.ex>\r\nrcpt to:<userx@test.ex>\r\ndata
+??? 250
+??? 250
+??? 354
+This is a test message.
+.
++++ 1
+****
+sleep 1
+killdaemon
+#
+# Also check for next input sent too soon
+#
+exim -DSERVER=server -bd -oX PORT_D
+****
+client -t5 127.0.0.1 PORT_D
+??? 220
+ehlo abcd
+??? 250-
+??? 250-
+??? 250-
+??? 250
+mail from:<userx@test.ex>\r\nrcpt to:<userx@test.ex>\r\ndata
+??? 250
+??? 250
+??? 354
+This is a test message.
+.\r\nrset
+??? 550
+****
+sleep 1
+killdaemon
diff --git a/test/scripts/2000-GnuTLS/2029 b/test/scripts/2000-GnuTLS/2029
new file mode 100644 (file)
index 0000000..e371e68
--- /dev/null
@@ -0,0 +1,57 @@
+# TLS server: SMTP still alive check before final response
+gnutls
+#
+exim -DSERVER=server -bd -oX PORT_D
+****
+# The pause (+++ 1) at the end of this is so that we don't close the input
+# until some time after sending the dot.
+#
+client-gnutls 127.0.0.1 PORT_D
+??? 220
+ehlo abcd
+??? 250-
+??? 250-
+??? 250-
+??? 250-
+??? 250
+starttls
+??? 220
+mail from:<userx@test.ex>
+??? 250
+rcpt to:<userx@test.ex>
+??? 250
+data
+??? 354
+This is a test message.
+.
++++ 1
+****
+sleep 1
+killdaemon
+#
+# Also check for next input sent too soon
+#
+exim -DSERVER=server -bd -oX PORT_D
+****
+client-gnutls 127.0.0.1 PORT_D
+??? 220
+ehlo abcd
+??? 250-
+??? 250-
+??? 250-
+??? 250-
+??? 250
+starttls
+??? 220
+mail from:<userx@test.ex>
+??? 250
+rcpt to:<userx@test.ex>
+??? 250
+data
+??? 354
+This is a test message.
+.\r\nrset
++++ 1
+****
+sleep 1
+killdaemon
diff --git a/test/scripts/2100-OpenSSL/2150 b/test/scripts/2100-OpenSSL/2150
new file mode 100644 (file)
index 0000000..cfc6a20
--- /dev/null
@@ -0,0 +1,55 @@
+# TLS server: SMTP still alive check before final response
+exim -DSERVER=server -bd -oX PORT_D
+****
+# The pause (+++ 1) at the end of this is so that we don't close the input
+# until some time after sending the dot.
+#
+client-gnutls 127.0.0.1 PORT_D
+??? 220
+ehlo abcd
+??? 250-
+??? 250-
+??? 250-
+??? 250-
+??? 250
+starttls
+??? 220
+mail from:<userx@test.ex>
+??? 250
+rcpt to:<userx@test.ex>
+??? 250
+data
+??? 354
+This is a test message.
+.
++++ 1
+****
+sleep 1
+killdaemon
+#
+# Also check for next input sent too soon
+#
+exim -DSERVER=server -bd -oX PORT_D
+****
+client-gnutls 127.0.0.1 PORT_D
+??? 220
+ehlo abcd
+??? 250-
+??? 250-
+??? 250-
+??? 250-
+??? 250
+starttls
+??? 220
+mail from:<userx@test.ex>
+??? 250
+rcpt to:<userx@test.ex>
+??? 250
+data
+??? 354
+This is a test message.
+.\r\nrset
++++ 1
+****
+sleep 1
+killdaemon
diff --git a/test/stderr/0559 b/test/stderr/0559
new file mode 100644 (file)
index 0000000..045fadc
--- /dev/null
@@ -0,0 +1,2 @@
+
+******** SERVER ********
diff --git a/test/stderr/2029 b/test/stderr/2029
new file mode 100644 (file)
index 0000000..045fadc
--- /dev/null
@@ -0,0 +1,2 @@
+
+******** SERVER ********
diff --git a/test/stderr/2150 b/test/stderr/2150
new file mode 100644 (file)
index 0000000..045fadc
--- /dev/null
@@ -0,0 +1,2 @@
+
+******** SERVER ********
index a41df39d36e623f972fed426223e733855b12e7c..8dd5a3cc17efc5c5acc5ce138759b4ea9227fec8 100644 (file)
@@ -27,8 +27,9 @@ Connecting to 127.0.0.1 port 1225 ... connected
 ??? 354
 <<< 354 Enter message, ending with "." on a line by itself
 >>> the message
->>> .\r\nmail from:<userx@test.ex>
+>>> .
 +++ 1
+>>> mail from:<userx@test.ex>
 >>> rcpt to:<userx@test.ex>\r\ndata\r\nthe message\r\nsecond line
 ??? 250
 <<< 250 OK id=10HmaX-0005vi-00
index 198962d06fa4f088ebdb744090205faff79137d4..964f0c17b50c8bc7e90355131bbae2d1e1277250 100644 (file)
@@ -36,9 +36,10 @@ Connecting to 127.0.0.1 port 1225 ... connected
 ??? 354
 <<< 354 Enter message, ending with "." on a line by itself
 >>> the message
->>> .\r\nmail from:<userx@test.ex>\r\nrcpt to:<userx@test.ex>\r\ndata\r\nthe message
+>>> .
 ??? 250
 <<< 250 OK id=10HmaX-0005vi-00
+>>> mail from:<userx@test.ex>\r\nrcpt to:<userx@test.ex>\r\ndata\r\nthe message
 ??? 250
 <<< 250 OK
 ??? 250
diff --git a/test/stdout/0559 b/test/stdout/0559
new file mode 100644 (file)
index 0000000..eee1b2e
--- /dev/null
@@ -0,0 +1,47 @@
+Connecting to 127.0.0.1 port 1225 ... connected
+??? 220
+<<< 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+>>> ehlo abcd
+??? 250-
+<<< 250-myhost.test.ex Hello abcd [127.0.0.1]
+??? 250-
+<<< 250-SIZE 52428800
+??? 250-
+<<< 250-PIPELINING
+??? 250
+<<< 250 HELP
+>>> mail from:<userx@test.ex>\r\nrcpt to:<userx@test.ex>\r\ndata
+??? 250
+<<< 250 OK
+??? 250
+<<< 250 Accepted
+??? 354
+<<< 354 Enter message, ending with "." on a line by itself
+>>> This is a test message.
+>>> .
++++ 1
+End of script
+Connecting to 127.0.0.1 port 1225 ... connected
+??? 220
+<<< 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+>>> ehlo abcd
+??? 250-
+<<< 250-myhost.test.ex Hello abcd [127.0.0.1]
+??? 250-
+<<< 250-SIZE 52428800
+??? 250-
+<<< 250-PIPELINING
+??? 250
+<<< 250 HELP
+>>> mail from:<userx@test.ex>\r\nrcpt to:<userx@test.ex>\r\ndata
+??? 250
+<<< 250 OK
+??? 250
+<<< 250 Accepted
+??? 354
+<<< 354 Enter message, ending with "." on a line by itself
+>>> This is a test message.
+>>> .\r\nrset
+??? 550
+<<< 550 Synchronization error (data after final dot)
+End of script
diff --git a/test/stdout/2029 b/test/stdout/2029
new file mode 100644 (file)
index 0000000..dd1bdae
--- /dev/null
@@ -0,0 +1,64 @@
+Connecting to 127.0.0.1 port 1225 ... connected
+??? 220
+<<< 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+>>> ehlo abcd
+??? 250-
+<<< 250-myhost.test.ex Hello abcd [127.0.0.1]
+??? 250-
+<<< 250-SIZE 52428800
+??? 250-
+<<< 250-PIPELINING
+??? 250-
+<<< 250-STARTTLS
+??? 250
+<<< 250 HELP
+>>> starttls
+??? 220
+<<< 220 TLS go ahead
+Attempting to start TLS
+Succeeded in starting TLS
+>>> mail from:<userx@test.ex>
+??? 250
+<<< 250 OK
+>>> rcpt to:<userx@test.ex>
+??? 250
+<<< 250 Accepted
+>>> data
+??? 354
+<<< 354 Enter message, ending with "." on a line by itself
+>>> This is a test message.
+>>> .
++++ 1
+End of script
+Connecting to 127.0.0.1 port 1225 ... connected
+??? 220
+<<< 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+>>> ehlo abcd
+??? 250-
+<<< 250-myhost.test.ex Hello abcd [127.0.0.1]
+??? 250-
+<<< 250-SIZE 52428800
+??? 250-
+<<< 250-PIPELINING
+??? 250-
+<<< 250-STARTTLS
+??? 250
+<<< 250 HELP
+>>> starttls
+??? 220
+<<< 220 TLS go ahead
+Attempting to start TLS
+Succeeded in starting TLS
+>>> mail from:<userx@test.ex>
+??? 250
+<<< 250 OK
+>>> rcpt to:<userx@test.ex>
+??? 250
+<<< 250 Accepted
+>>> data
+??? 354
+<<< 354 Enter message, ending with "." on a line by itself
+>>> This is a test message.
+>>> .\r\nrset
++++ 1
+End of script
diff --git a/test/stdout/2150 b/test/stdout/2150
new file mode 100644 (file)
index 0000000..dd1bdae
--- /dev/null
@@ -0,0 +1,64 @@
+Connecting to 127.0.0.1 port 1225 ... connected
+??? 220
+<<< 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+>>> ehlo abcd
+??? 250-
+<<< 250-myhost.test.ex Hello abcd [127.0.0.1]
+??? 250-
+<<< 250-SIZE 52428800
+??? 250-
+<<< 250-PIPELINING
+??? 250-
+<<< 250-STARTTLS
+??? 250
+<<< 250 HELP
+>>> starttls
+??? 220
+<<< 220 TLS go ahead
+Attempting to start TLS
+Succeeded in starting TLS
+>>> mail from:<userx@test.ex>
+??? 250
+<<< 250 OK
+>>> rcpt to:<userx@test.ex>
+??? 250
+<<< 250 Accepted
+>>> data
+??? 354
+<<< 354 Enter message, ending with "." on a line by itself
+>>> This is a test message.
+>>> .
++++ 1
+End of script
+Connecting to 127.0.0.1 port 1225 ... connected
+??? 220
+<<< 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+>>> ehlo abcd
+??? 250-
+<<< 250-myhost.test.ex Hello abcd [127.0.0.1]
+??? 250-
+<<< 250-SIZE 52428800
+??? 250-
+<<< 250-PIPELINING
+??? 250-
+<<< 250-STARTTLS
+??? 250
+<<< 250 HELP
+>>> starttls
+??? 220
+<<< 220 TLS go ahead
+Attempting to start TLS
+Succeeded in starting TLS
+>>> mail from:<userx@test.ex>
+??? 250
+<<< 250 OK
+>>> rcpt to:<userx@test.ex>
+??? 250
+<<< 250 Accepted
+>>> data
+??? 354
+<<< 354 Enter message, ending with "." on a line by itself
+>>> This is a test message.
+>>> .\r\nrset
++++ 1
+End of script