summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Harris <jgh146exb@wizmail.org>2017-01-31 21:38:22 +0000
committerPhil Pennock <pdp@exim.org>2017-02-02 18:24:25 -0500
commitf2613b851682dacdbf6edb9c8f094cfa00e22b9f (patch)
tree0755f75bae803fe309afb412269f736d785f704d
parentfa58f4a826406d77c1f9166a0766b1ea99589aad (diff)
downloadexim4-f2613b851682dacdbf6edb9c8f094cfa00e22b9f.tar.gz
Fix error logged for send failureexim-4_89_RC2
Broken-by: de6273b487f1 (cherry picked from commit 829dd84217ed9c32fda88a4ca2cb20b41c950f1e) Signed-off-by: Phil Pennock <pdp@exim.org>
-rw-r--r--src/src/debug.c8
-rw-r--r--src/src/transports/smtp.c12
2 files changed, 10 insertions, 10 deletions
diff --git a/src/src/debug.c b/src/src/debug.c
index cc60b44a6..8f9359b15 100644
--- a/src/src/debug.c
+++ b/src/src/debug.c
@@ -143,7 +143,8 @@ If debug_pid is nonzero, print the pid at the start of each line. This is for
tidier output when running parallel remote deliveries with debugging turned on.
Must do the whole thing with a single printf and flush, as otherwise output may
get interleaved. Since some calls to debug_printf() don't end with newline,
-we save up the text until we do get the newline. */
+we save up the text until we do get the newline.
+Take care to not disturb errno. */
void
debug_printf(const char *format, ...)
@@ -157,7 +158,9 @@ va_end(ap);
void
debug_vprintf(const char *format, va_list ap)
{
-if (debug_file == NULL) return;
+int save_errno = errno;
+
+if (!debug_file) return;
/* Various things can be inserted at the start of a line. Don't use the
tod_stamp() function for the timestamp, because that will overwrite the
@@ -235,6 +238,7 @@ if (debug_ptr[-1] == '\n')
debug_ptr = debug_buffer;
debug_prefix_length = 0;
}
+errno = save_errno;
}
/* End of debug.c */
diff --git a/src/src/transports/smtp.c b/src/src/transports/smtp.c
index 43b623513..e177ee9c3 100644
--- a/src/src/transports/smtp.c
+++ b/src/src/transports/smtp.c
@@ -1454,9 +1454,7 @@ smtp_setup_conn(smtp_context * sx, BOOL suppress_tls)
dns_answer tlsa_dnsa;
#endif
BOOL pass_message = FALSE;
-
uschar * message = NULL;
-int save_errno;
int yield = OK;
int rc;
@@ -1551,14 +1549,13 @@ if (continue_hostname == NULL)
if (sx->inblock.sock < 0)
{
uschar * msg = NULL;
- int save_errno = errno;
if (sx->verify)
{
msg = strerror(errno);
HDEBUG(D_verify) debug_printf("connect: %s\n", msg);
}
set_errno_nohost(sx->addrlist,
- save_errno == ETIMEDOUT ? ERRNO_CONNECTTIMEOUT : save_errno,
+ errno == ETIMEDOUT ? ERRNO_CONNECTTIMEOUT : errno,
sx->verify ? string_sprintf("could not connect: %s", msg)
: NULL,
DEFER, FALSE);
@@ -2104,13 +2101,13 @@ return OK;
SEND_FAILED:
code = '4';
message = US string_sprintf("send() to %s [%s] failed: %s",
- sx->host->name, sx->host->address, strerror(save_errno));
+ sx->host->name, sx->host->address, strerror(errno));
sx->send_quit = FALSE;
goto FAILED;
/* This label is jumped to directly when a TLS negotiation has failed,
or was not done for a host for which it is required. Values will be set
- in message and save_errno, and setting_up will always be true. Treat as
+ in message and errno, and setting_up will always be true. Treat as
a temporary error. */
EHLOHELO_FAILED:
@@ -2134,7 +2131,6 @@ return OK;
tried again for a while. */
FAILED:
- save_errno = errno;
sx->ok = FALSE; /* For when reached by GOTO */
yield = code == '5'
@@ -2143,7 +2139,7 @@ FAILED:
#endif
? FAIL : DEFER;
- set_errno(sx->addrlist, save_errno, message, yield, pass_message, sx->host
+ set_errno(sx->addrlist, errno, message, yield, pass_message, sx->host
#ifdef EXPERIMENTAL_DSN_INFO
, sx->smtp_greeting, sx->helo_response
#endif