{
int fd, rc;
fd_set fds;
-struct timeval tzero;
+struct timeval tzero = {.tv_sec = 0, .tv_usec = 0};
#ifndef DISABLE_TLS
if (tls_in.active.sock >= 0)
fd = fileno(smtp_in);
FD_ZERO(&fds);
FD_SET(fd, &fds);
-tzero.tv_sec = 0;
-tzero.tv_usec = 0;
rc = select(fd + 1, (SELECT_ARG2_TYPE *)&fds, NULL, NULL, &tzero);
if (rc <= 0) return TRUE; /* Not ready to read */
{
#ifndef DISABLE_DKIM
int n = smtp_inend - smtp_inptr;
+if (chunking_state == CHUNKING_LAST && chunking_data_left < n)
+ n = chunking_data_left;
if (n > 0)
dkim_exim_verify_feed(smtp_inptr, n);
#endif
acl_warn_logged = acl_warn_logged->next;
store_free(this);
}
+
+message_tidyup();
store_reset(reset_point);
+
+message_start();
return store_mark();
}
case MAIL_CMD:
smtp_mailcmd_count++; /* Count for no-mail log */
- if (sender_address != NULL)
+ if (sender_address)
/* The function moan_smtp_batch() does not return. */
moan_smtp_batch(smtp_cmd_buffer, "503 Sender already given");
smtp_printf("221 %s closing connection\r\n", FALSE, smtp_active_hostname);
#ifndef DISABLE_TLS
-tls_close(NULL, TLS_SHUTDOWN_NOWAIT);
+tls_close(NULL, TLS_SHUTDOWN_WAIT);
#endif
log_write(L_smtp_connection, LOG_MAIN, "%s closed by QUIT",
smtp_get_connection_info());
+
+/* Pause, hoping client will FIN first so that they get the TIME_WAIT.
+The socket should become readble (though with no data) */
+
+ {
+ int fd = fileno(smtp_in);
+ fd_set fds;
+ struct timeval t_limit = {.tv_sec = 0, .tv_usec = 200*1000};
+
+ FD_ZERO(&fds);
+ FD_SET(fd, &fds);
+ (void) select(fd + 1, (SELECT_ARG2_TYPE *)&fds, NULL, NULL, &t_limit);
+ }
}
case MAIL_CMD:
HAD(SCH_MAIL);
smtp_mailcmd_count++; /* Count for limit and ratelimit */
+ message_start();
was_rej_mail = TRUE; /* Reset if accepted */
env_mail_type_t * mail_args; /* Sanity check & validate args */