ACL: Ensure that acl_smtp_notquit is called for a conndrop between data-go-ahead...
authorJasen Betts <jasen@xnet.co.nz>
Thu, 11 Aug 2016 22:31:57 +0000 (23:31 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Thu, 11 Aug 2016 22:31:57 +0000 (23:31 +0100)
Bug 1872

doc/doc-txt/ChangeLog
src/src/receive.c
src/src/smtp_in.c

index 60a4e4ea4ca2193b5853d083e291c54dc251435e..7304c9c04d1f4043b1538b190b7e1e5338d9008a 100644 (file)
@@ -71,7 +71,10 @@ JH/17 Fakereject: previously logged as a norml message arrival "<="; now
 JH/18 Bug 1867: make the fail_defer_domains option on a dnslookup router work
       for missing MX records.  Previously it only worked for missing A records.
 
 JH/18 Bug 1867: make the fail_defer_domains option on a dnslookup router work
       for missing MX records.  Previously it only worked for missing A records.
 
-JH/19 Buf 1850: support Radius libraries that return REJECT_RC
+JH/19 Bug 1850: support Radius libraries that return REJECT_RC.
+
+JH/20 Bug 1872: Ensure that acl_smtp_notquit is run when the connection drops
+      after the data-go-ahead and data-ack.  Patch from Jason Betts.
 
 
 Exim version 4.87
 
 
 Exim version 4.87
index 3351ab1c535998b84e8c55f579e60aa575860666..4d30419f05cad2dcae901a4c826752ce6da76818 100644 (file)
@@ -986,6 +986,7 @@ handle_lost_connection(uschar *s)
 {
 log_write(L_lost_incoming_connection | L_smtp_connection, LOG_MAIN,
   "%s lost while reading message data%s", smtp_get_connection_info(), s);
 {
 log_write(L_lost_incoming_connection | L_smtp_connection, LOG_MAIN,
   "%s lost while reading message data%s", smtp_get_connection_info(), s);
+smtp_notquit_exit(US"connection-lost", NULL, NULL);
 return US"421 Lost incoming connection";
 }
 
 return US"421 Lost incoming connection";
 }
 
@@ -4019,14 +4020,14 @@ if (smtp_input && sender_host_address != NULL && !sender_host_notsocket &&
     int c = (receive_getc)();
     if (c != EOF) (receive_ungetc)(c); else
       {
     int c = (receive_getc)();
     if (c != EOF) (receive_ungetc)(c); else
       {
-      uschar *msg = US"SMTP connection lost after final dot";
+      smtp_notquit_exit(US"connection-lost", NULL, NULL);
       smtp_reply = US"";    /* No attempt to send a response */
       smtp_yield = FALSE;   /* Nothing more on this connection */
 
       /* Re-use the log line workspace */
 
       sptr = 0;
       smtp_reply = US"";    /* No attempt to send a response */
       smtp_yield = FALSE;   /* Nothing more on this connection */
 
       /* Re-use the log line workspace */
 
       sptr = 0;
-      s = string_cat(s, &size, &sptr, msg);
+      s = string_cat(s, &size, &sptr, US"SMTP connection lost after final dot");
       s = add_host_info_for_log(s, &size, &sptr);
       s[sptr] = 0;
       log_write(0, LOG_MAIN, "%s", s);
       s = add_host_info_for_log(s, &size, &sptr);
       s[sptr] = 0;
       log_write(0, LOG_MAIN, "%s", s);
index 34481aef73229c5e5a83b838db771c75f66e821b..09356c23115d3d7a71be033d3842c306a321940f 100644 (file)
@@ -3057,12 +3057,11 @@ smtp_exit_function_called = TRUE;
 
 /* Call the not-QUIT ACL, if there is one, unless no reason is given. */
 
 
 /* Call the not-QUIT ACL, if there is one, unless no reason is given. */
 
-if (acl_smtp_notquit != NULL && reason != NULL)
+if (acl_smtp_notquit && reason)
   {
   smtp_notquit_reason = reason;
   {
   smtp_notquit_reason = reason;
-  rc = acl_check(ACL_WHERE_NOTQUIT, NULL, acl_smtp_notquit, &user_msg,
-    &log_msg);
-  if (rc == ERROR)
+  if ((rc = acl_check(ACL_WHERE_NOTQUIT, NULL, acl_smtp_notquit, &user_msg,
+                     &log_msg)) == ERROR)
     log_write(0, LOG_MAIN|LOG_PANIC, "ACL for not-QUIT returned ERROR: %s",
       log_msg);
   }
     log_write(0, LOG_MAIN|LOG_PANIC, "ACL for not-QUIT returned ERROR: %s",
       log_msg);
   }
@@ -3072,9 +3071,11 @@ responses are all internal, they should always fit in the buffer, but code a
 warning, just in case. Note that string_vformat() still leaves a complete
 string, even if it is incomplete. */
 
 warning, just in case. Note that string_vformat() still leaves a complete
 string, even if it is incomplete. */
 
-if (code != NULL && defaultrespond != NULL)
+if (code && defaultrespond)
   {
   {
-  if (user_msg == NULL)
+  if (user_msg)
+    smtp_respond(code, 3, TRUE, user_msg);
+  else
     {
     uschar buffer[128];
     va_list ap;
     {
     uschar buffer[128];
     va_list ap;
@@ -3084,8 +3085,6 @@ if (code != NULL && defaultrespond != NULL)
     smtp_printf("%s %s\r\n", code, buffer);
     va_end(ap);
     }
     smtp_printf("%s %s\r\n", code, buffer);
     va_end(ap);
     }
-  else
-    smtp_respond(code, 3, TRUE, user_msg);
   mac_smtp_fflush();
   }
 }
   mac_smtp_fflush();
   }
 }