git://git.exim.org
/
exim.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Avoid modifying global errno when raising event
[exim.git]
/
src
/
src
/
smtp_out.c
diff --git
a/src/src/smtp_out.c
b/src/src/smtp_out.c
index 4e8c4486944476610c96e60bd96b05362c8f4795..608a781eb7fbca5ccb82833267a5f8626ebec0b4 100644
(file)
--- a/
src/src/smtp_out.c
+++ b/
src/src/smtp_out.c
@@
-3,7
+3,7
@@
*************************************************/
/* Copyright (c) University of Cambridge 1995 - 2018 */
*************************************************/
/* Copyright (c) University of Cambridge 1995 - 2018 */
-/* Copyright (c) The Exim Maintainers 2020 */
+/* Copyright (c) The Exim Maintainers 2020
- 2021
*/
/* See the file NOTICE for conditions of use and distribution. */
/* A number of functions for driving outgoing SMTP calls. */
/* See the file NOTICE for conditions of use and distribution. */
/* A number of functions for driving outgoing SMTP calls. */
@@
-27,7
+27,7
@@
Arguments:
which case the function does nothing
host_af AF_INET or AF_INET6 for the outgoing IP address
addr the mail address being handled (for setting errors)
which case the function does nothing
host_af AF_INET or AF_INET6 for the outgoing IP address
addr the mail address being handled (for setting errors)
- interface point this to the interface
+ interface point this to the interface
if there is one defined
msg to add to any error message
Returns: TRUE on success, FALSE on failure, with error message
msg to add to any error message
Returns: TRUE on success, FALSE on failure, with error message
@@
-64,11
+64,10
@@
if (is_tainted2(expint, LOG_MAIN|LOG_PANIC, "Tainted value '%s' from '%s' for in
Uskip_whitespace(&expint);
if (!*expint) return TRUE;
Uskip_whitespace(&expint);
if (!*expint) return TRUE;
-/* we just tested to ensure no taint, so big_buffer is ok */
-while ((iface = string_nextinlist(&expint, &sep, big_buffer,
- big_buffer_size)))
+while ((iface = string_nextinlist(&expint, &sep, NULL, 0)))
{
{
- if (string_is_ip_address(iface, NULL) == 0)
+ int if_af = string_is_ip_address(iface, NULL);
+ if (if_af == 0)
{
addr->transport_return = PANIC;
addr->message = string_sprintf("\"%s\" is not a valid IP "
{
addr->transport_return = PANIC;
addr->message = string_sprintf("\"%s\" is not a valid IP "
@@
-77,11
+76,11
@@
while ((iface = string_nextinlist(&expint, &sep, big_buffer,
return FALSE;
}
return FALSE;
}
- if ((
(Ustrchr(iface, ':') == NULL)? AF_INET:
AF_INET6) == host_af)
+ if ((
if_af == 4 ? AF_INET :
AF_INET6) == host_af)
break;
}
break;
}
-
if (iface) *interface = string_copy(iface)
;
+
*interface = iface
;
return TRUE;
}
return TRUE;
}
@@
-151,9
+150,16
@@
return TRUE;
#ifdef TCP_FASTOPEN
#ifdef TCP_FASTOPEN
+/* Try to record if TFO was attmepted and if it was successfully used. */
+
static void
tfo_out_check(int sock)
{
static void
tfo_out_check(int sock)
{
+static BOOL done_once = FALSE;
+
+if (done_once) return;
+done_once = TRUE;
+
# ifdef __FreeBSD__
struct tcp_info tinfo;
socklen_t len = sizeof(tinfo);
# ifdef __FreeBSD__
struct tcp_info tinfo;
socklen_t len = sizeof(tinfo);
@@
-277,7
+283,7
@@
const blob * fastopen_blob = NULL;
#ifndef DISABLE_EVENT
deliver_host_address = host->address;
deliver_host_port = port;
#ifndef DISABLE_EVENT
deliver_host_address = host->address;
deliver_host_port = port;
-if (event_raise(tb->event_action, US"tcp:connect", NULL)) return -1;
+if (event_raise(tb->event_action, US"tcp:connect", NULL
, &errno
)) return -1;
#endif
if ((sock = ip_socket(SOCK_STREAM, host_af)) < 0) return -1;
#endif
if ((sock = ip_socket(SOCK_STREAM, host_af)) < 0) return -1;
@@
-857,7
+863,7
@@
for (;;)
}
#ifdef TCP_FASTOPEN
}
#ifdef TCP_FASTOPEN
-
tfo_out_check(sx->cctx.sock);
+tfo_out_check(sx->cctx.sock);
#endif
/* Return a value that depends on the SMTP return code. On some systems a
#endif
/* Return a value that depends on the SMTP return code. On some systems a