[exim-cvs] Retries: rework DB keys, and fix exinext IPv6. Bu…

Góra strony
Delete this message
Reply to this message
Autor: Exim Git Commits Mailing List
Data:  
Dla: exim-cvs
Temat: [exim-cvs] Retries: rework DB keys, and fix exinext IPv6. Bug 3086
Gitweb: https://git.exim.org/exim.git/commitdiff/5e0ccec4397bd2d21cc1473681a62e7c2fb6afbe
Commit:     5e0ccec4397bd2d21cc1473681a62e7c2fb6afbe
Parent:     ad64ad24d66f32af7af302b625f7a7be0ac6b988
Author:     Jeremy Harris <jgh146exb@???>
AuthorDate: Thu Apr 4 15:53:53 2024 +0100
Committer:  Jeremy Harris <jgh146exb@???>
CommitDate: Thu Apr 4 23:00:58 2024 +0100


    Retries: rework DB keys, and fix exinext IPv6. Bug 3086
---
 doc/doc-txt/ChangeLog     |  5 +++++
 src/src/deliver.c         |  8 +++----
 src/src/exim_dbutil.c     |  2 +-
 src/src/exinext.src       | 47 +++++++++------------------------------
 src/src/functions.h       |  9 +++++---
 src/src/retry.c           | 56 ++++++++++++++++++++++++++++++++++-------------
 src/src/string.c          |  2 +-
 src/src/structs.h         |  2 +-
 src/src/transports/smtp.c | 16 +++++---------
 src/src/tree.c            | 10 ++++-----
 test/runtest              |  8 +++++--
 test/stderr/0388          | 12 +++++-----
 test/stderr/0450          |  4 ++--
 test/stderr/0476          |  2 +-
 test/stderr/0512          | 12 +++++-----
 test/stderr/0623          |  4 ++--
 test/stderr/0909          |  4 ++--
 test/stdout/0213          |  2 +-
 test/stdout/0343          |  4 ++--
 test/stdout/0447          |  6 ++---
 test/stdout/0450          |  4 ++--
 test/stdout/0474          |  4 ++--
 test/stdout/0497          |  2 +-
 test/stdout/0498          |  2 +-
 test/stdout/0610          |  4 ++--
 test/stdout/1008          | 12 ++++------
 26 files changed, 123 insertions(+), 120 deletions(-)


diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog
index 611a2ee76..65da3cead 100644
--- a/doc/doc-txt/ChangeLog
+++ b/doc/doc-txt/ChangeLog
@@ -140,6 +140,11 @@ JH/27 Fix crash in logging.  When a message with a large number of recipients
       messages were created as a result.
       Find and debug help by Mateusz Krawczyk


+JH/28 Bug 3086: Fix exinext for ipv6.  Change the format of keys in the retry
+      DB, wrapping transport record bare-ip "host names" and ipv6
+      "host addresses" in square-brackets.  This makes the parsing that
+      exinext does more reliable.
+


Exim version 4.97
-----------------
diff --git a/src/src/deliver.c b/src/src/deliver.c
index 70f44535f..0157743a1 100644
--- a/src/src/deliver.c
+++ b/src/src/deliver.c
@@ -2039,7 +2039,7 @@ static BOOL
previously_transported(address_item *addr, BOOL testing)
{
uschar * s = string_sprintf("%s/%s",
- addr->unique + (testflag(addr, af_homonym)? 3:0), addr->transport->name);
+ addr->unique + (testflag(addr, af_homonym) ? 3:0), addr->transport->name);

 if (tree_search(tree_nonrecipients, s) != 0)
   {
@@ -3142,7 +3142,7 @@ while (addr_local)
     if (result == DEFER || testflag(addr2, af_lt_retry_exists))
       {
       int flags = result == DEFER ? 0 : rf_delete;
-      uschar *retry_key = string_copy(tp->retry_use_local_part
+      uschar * retry_key = string_copy(tp->retry_use_local_part
     ? addr2->address_retry_key : addr2->domain_retry_key);
       *retry_key = 'T';
       retry_add_item(addr2, retry_key, flags);
@@ -7292,7 +7292,7 @@ while (addr_new)           /* Loop until all addresses dealt with */


       addr->unique =
         string_sprintf("%s:%s", addr->address, addr->parent->unique +
-          (testflag(addr->parent, af_homonym)? 3:0));
+          (testflag(addr->parent, af_homonym) ? 3:0));


       addr->address_retry_key = addr->domain_retry_key =
         string_sprintf("T:%s", addr->unique);
@@ -7729,7 +7729,7 @@ while (addr_new)           /* Loop until all addresses dealt with */


     else if (testflag(addr, af_dr_retry_exists))
       {
-      uschar *altkey = string_sprintf("%s:<%s>", addr->address_retry_key,
+      uschar * altkey = string_sprintf("%s:<%s>", addr->address_retry_key,
         sender_address);
       retry_add_item(addr, altkey, rf_delete);
       retry_add_item(addr, addr->address_retry_key, rf_delete);
diff --git a/src/src/exim_dbutil.c b/src/src/exim_dbutil.c
index 4d213773b..c868832b1 100644
--- a/src/src/exim_dbutil.c
+++ b/src/src/exim_dbutil.c
@@ -628,7 +628,7 @@ for (uschar * key = dbfn_scan(dbm, TRUE, &cursor);
       print_time(retry->first_failed));
     printf("%s  ", print_time(retry->last_try));
     printf("%s %s\n", print_time(retry->next_try),
-      (retry->expired)? "*" : "");
+      retry->expired ? "*" : "");
     break;


       case type_wait:
diff --git a/src/src/exinext.src b/src/src/exinext.src
index 882ad5f60..5724812c4 100644
--- a/src/src/exinext.src
+++ b/src/src/exinext.src
@@ -195,45 +195,18 @@ perl - $exim_path "$eximmacdef" $argone $spool_directory $qualify_domain $config
         $printed = 1;
         if (/^\s*T:[^:\s]*:/)
           {
+      # We rely on non-space-containing strings, for parsing
+
           ($key,$error,$error2,$text) = /^\s*T:(\S+)\s+(\S+)\s+(\S+)\s*(.*)$/;


-          # Parsing the keys is a nightmare because of IPv6. The design of the
-          # format for the keys is a complete shambles. All my fault (PH). But
-          # I don't want to change it just for this purpose. If they key
-          # contains more than 3 colons, we have an IPv6 address, because
-          # an IPv6 address must contain at least two colons.
-
-          # Deal with IPv4 addresses (3 colons or fewer)
-
-          if ($key !~ /:([^:]*?:){3}/)
-            {
-            ($host,$ip,$port,$msgid) = $key =~
-              /^([^:]*):([^:]*)(?::([^:]*)(?::(\S*)|)|)/;
-            }
-
-          # Deal with IPv6 addresses; sorting out the colons is a complete
-          # mess. We should be able to find the host name and IP address from
-          # further in the message. That seems the easiest escape plan here. We
-          # can use those to match the rest of the key.
-
-          else
-            {
-            ($host,$ip) = $text =~ /host\s(\S+)\s\[([^]]+)\]/;
-            if (defined $host)
-              {
-              ($port,$msgid) = $key =~
-                /^$host:$ip(?::([^:]*)(?::(\S*)|)|)/;
-              }
-
-           # This will probably be wrong...
-
-           else
-             {
-             ($host,$ip) = $key =~ /([^:]*):(.*)/;
-             }
-            }
-
-          printf("Transport: %s [%s]", $host, $ip);
+      ($host,$ip,$port,$msgid) = $key =~
+        /^([^:[]*|\[[^]]*\])    # host (could be an ip)
+          :([^:[]*|\[[^]]*\])    # ip
+          (?::(\d{1,5}))?        # maybe port
+          (?::(\S{23}))?        # maybe msgid
+          $/x;
+
+          printf("Transport: %s %s", $host, $ip);
           print ":$port" if defined $port;
           print " $msgid" if defined $msgid;
           print " error $error: $text\n";
diff --git a/src/src/functions.h b/src/src/functions.h
index b2f948650..9f6396a17 100644
--- a/src/src/functions.h
+++ b/src/src/functions.h
@@ -454,11 +454,14 @@ extern BOOL    regex_match_and_setup(const pcre2_code *, const uschar *, int, in
 extern const pcre2_code *regex_compile(const uschar *, mcs_flags, uschar **,
         pcre2_compile_context *);
 extern const pcre2_code *regex_must_compile(const uschar *, mcs_flags, BOOL);
-extern void    retry_add_item(address_item *, uschar *, int);
+
+extern void    retry_add_item(address_item *, const uschar *, int);
 extern BOOL    retry_check_address(const uschar *, host_item *, uschar *, BOOL,
-                 uschar **, uschar **);
+                 const uschar **, const uschar **);
 extern retry_config *retry_find_config(const uschar *, const uschar *, int, int);
-extern BOOL    retry_ultimate_address_timeout(uschar *, const uschar *,
+extern const uschar *retry_host_key_build(const host_item *, BOOL,
+          const uschar *);
+extern BOOL    retry_ultimate_address_timeout(const uschar *, const uschar *,
                  dbdata_retry *, time_t);
 extern void    retry_update(address_item **, address_item **, address_item **);
 extern const uschar *rewrite_address(const uschar *, BOOL, BOOL, rewrite_rule *, int);
diff --git a/src/src/retry.c b/src/src/retry.c
index 42393d424..6b977dd58 100644
--- a/src/src/retry.c
+++ b/src/src/retry.c
@@ -31,7 +31,7 @@ Returns:        TRUE if the ultimate timeout has been reached
 */


BOOL
-retry_ultimate_address_timeout(uschar *retry_key, const uschar *domain,
+retry_ultimate_address_timeout(const uschar * retry_key, const uschar *domain,
dbdata_retry *retry_record, time_t now)
{
BOOL address_timeout;
@@ -75,6 +75,29 @@ return address_timeout;



+const uschar *
+retry_host_key_build(const host_item * host, BOOL incl_ip,
+  const uschar * portstring)
+{
+const uschar * s = host->name;
+gstring * g = string_is_ip_address(s, NULL)
+  ? string_fmt_append(NULL, "T:[%s]", s)    /* wrap a name which is a bare ip */
+  : string_fmt_append(NULL, "T:%s",   s);
+
+s = host->address;
+if (incl_ip)
+  g = Ustrchr(s, ':')
+    ? string_fmt_append(g, ":[%s]", s)        /* wrap an ipv6  */
+    : string_fmt_append(g, ":%s",   s);
+
+if (portstring)
+  g = string_cat(g, portstring);
+
+gstring_release_unused(g);
+return string_from_gstring(g);
+}
+
+
 /*************************************************
 *     Set status of a host+address item          *
 *************************************************/
@@ -124,11 +147,12 @@ Returns:    TRUE if the host has expired but is usable because


BOOL
retry_check_address(const uschar *domain, host_item *host, uschar *portstring,
- BOOL include_ip_address, uschar **retry_host_key, uschar **retry_message_key)
+ BOOL include_ip_address,
+ const uschar **retry_host_key, const uschar **retry_message_key)
{
BOOL yield = FALSE;
time_t now = time(NULL);
-uschar * host_key, * message_key;
+const uschar * host_key, * message_key;
open_db dbblock, * dbm_file;
tree_node * node;
dbdata_retry * host_retry_record, * message_retry_record;
@@ -143,14 +167,11 @@ if (host->status != hstatus_unknown) return FALSE;
host->status = hstatus_usable;

/* Generate the host key for the unusable tree and the retry database. Ensure
-host names are lower cased (that's what %S does). */
-
-host_key = include_ip_address
- ? string_sprintf("T:%S:%s%s", host->name, host->address, portstring)
- : string_sprintf("T:%S%s", host->name, portstring);
-
-/* Generate the message-specific key */
+host names are lower cased (that's what %S does).
+Generate the message-specific key too.
+Be sure to maintain lack-of-spaces in retry keys; exinext depends on it. */

+host_key = retry_host_key_build(host, include_ip_address, portstring);
message_key = string_sprintf("%s:%s", host_key, message_id);

/* Search the tree of unusable IP addresses. This is filled in when deliveries
@@ -290,7 +311,7 @@ Returns: nothing
*/

 void
-retry_add_item(address_item *addr, uschar *key, int flags)
+retry_add_item(address_item * addr, const uschar * key, int flags)
 {
 retry_item * rti = store_get(sizeof(retry_item), GET_UNTAINTED);
 host_item * host = addr->host_used;
@@ -343,11 +364,11 @@ Returns:       pointer to retry rule, or NULL
 */


retry_config *
-retry_find_config(const uschar *key, const uschar *alternate, int basic_errno,
+retry_find_config(const uschar * key, const uschar * alternate, int basic_errno,
int more_errno)
{
-const uschar *colon = Ustrchr(key, ':');
-retry_config *yield;
+const uschar * colon = Ustrchr(key, ':');
+retry_config * yield;

/* If there's a colon in the key, there are two possibilities:

@@ -355,7 +376,8 @@ retry_config *yield;

       hostname:ip+port


-    In this case, we copy the host name.
+    In this case, we copy the host name (which could be an [ip], including
+    being an [ipv6], and we drop the []).


(2) This is a key for a pipe, file, or autoreply delivery, in the format

@@ -369,6 +391,8 @@ retry_config *yield;
 if (colon)
   key = isalnum(*key)
     ? string_copyn(key, colon-key)    /* the hostname */
+    : *key == '['
+    ? string_copyn(key+1, Ustrchr(key, ']')-1-key)    /* the ip */
     : Ustrrchr(key, ':') + 1;        /* Take from the last colon */


/* Sort out the keys */
@@ -932,3 +956,5 @@ DEBUG(D_retry) debug_printf("end of retry processing\n");
}

 /* End of retry.c */
+/* vi: aw ai sw=2
+*/
diff --git a/src/src/string.c b/src/src/string.c
index cd76e1f1c..a627611af 100644
--- a/src/src/string.c
+++ b/src/src/string.c
@@ -1698,7 +1698,7 @@ while (*fp)
     }


       /* If a width is not specified and the precision is specified, set
-      the width to the precision, or the string length if shorted. */
+      the width to the precision, or the string length if shorter. */


       else if (precision >= 0)
     width = precision < slen ? precision : slen;
diff --git a/src/src/structs.h b/src/src/structs.h
index b16a8a3f2..8aab54055 100644
--- a/src/src/structs.h
+++ b/src/src/structs.h
@@ -480,7 +480,7 @@ can be tried. */


 typedef struct retry_item {
   struct retry_item *next;        /* for chaining */
-  uschar *key;                    /* string identifying host/address/message */
+  const uschar *key;              /* string identifying host/address/message */
   int     basic_errno;            /* error code for this destination */
   int     more_errno;             /* additional error information */
   uschar *message;                /* local error message */
diff --git a/src/src/transports/smtp.c b/src/src/transports/smtp.c
index ed5994241..a5f99edaa 100644
--- a/src/src/transports/smtp.c
+++ b/src/src/transports/smtp.c
@@ -1306,7 +1306,7 @@ while (count-- > 0)


     if (testflag(addr, af_dr_retry_exists))
       {
-      uschar *altkey = string_sprintf("%s:<%s>", addr->address_retry_key,
+      uschar * altkey = string_sprintf("%s:<%s>", addr->address_retry_key,
         sender_address);
       retry_add_item(addr, altkey, rf_delete);
       retry_add_item(addr, addr->address_retry_key, rf_delete);
@@ -1322,7 +1322,7 @@ while (count-- > 0)


   else if (errno == ETIMEDOUT)
     {
-    uschar *message = string_sprintf("SMTP timeout after RCPT TO:<%s>",
+    uschar * message = string_sprintf("SMTP timeout after RCPT TO:<%s>",
         transport_rcpt_address(addr, sx->conn_args.tblock->rcpt_include_affixes));
     set_errno_nohost(sx->first_addr, ETIMEDOUT, message, DEFER, FALSE, &sx->delivery_start);
     retry_add_item(addr, addr->address_retry_key, 0);
@@ -5376,7 +5376,7 @@ retry_non_continued:
     BOOL host_is_expired = FALSE, message_defer = FALSE, some_deferred = FALSE;
     address_item * first_addr = NULL;
     uschar * interface = NULL;
-    uschar * retry_host_key = NULL, * retry_message_key = NULL;
+    const uschar * retry_host_key = NULL, * retry_message_key = NULL;
     uschar * serialize_key = NULL;


     /* Deal slightly better with a possible Linux kernel bug that results
@@ -5873,9 +5873,7 @@ retry_non_continued:
           ob->expand_retry_include_ip_address, &incl_ip) != OK)
       incl_ip = TRUE;    /* error; use most-specific retry record */


-        retry_host_key = incl_ip
-      ? string_sprintf("T:%S:%s%s", host->name, host->address, pistring)
-      : string_sprintf("T:%S%s", host->name, pistring);
+        retry_host_key = retry_host_key_build(host, incl_ip, pistring);
         }


       /* If a delivery of another message over an existing SMTP connection
@@ -5921,10 +5919,8 @@ retry_non_continued:
           ob->expand_retry_include_ip_address, &incl_ip) != OK)
       incl_ip = TRUE;    /* error; use most-specific retry record */


-        retry_message_key = incl_ip
-      ? string_sprintf("T:%S:%s%s:%s", host->name, host->address, pistring,
-          message_id)
-      : string_sprintf("T:%S%s:%s", host->name, pistring, message_id);
+        retry_message_key = string_sprintf("%s:%s",
+      retry_host_key_build(host, incl_ip, pistring), message_id);
         }
       retry_add_item(addrlist, retry_message_key,
         rf_message | rf_host | delete_flag);
diff --git a/src/src/tree.c b/src/src/tree.c
index eb54829db..2c703583e 100644
--- a/src/src/tree.c
+++ b/src/src/tree.c
@@ -65,6 +65,7 @@ if (!tree_insertnode(&tree_duplicates, node)) store_reset(rpoint);




+#ifndef COMPILE_UTILITY
 /*************************************************
 *    Add entry to unusable addresses tree        *
 *************************************************/
@@ -76,12 +77,11 @@ Returns:     nothing
 */


 void
-tree_add_unusable(const host_item *h)
+tree_add_unusable(const host_item * h)
 {
 rmark rpoint = store_mark();
-tree_node *node;
-uschar s[256];
-sprintf(CS s, "T:%.200s:%s", h->name, h->address);
+tree_node * node;
+const uschar * s = retry_host_key_build(h, TRUE, NULL);
 node = store_get(sizeof(tree_node) + Ustrlen(s),
         is_tainted(h->name) || is_tainted(h->address) ? GET_TAINTED : GET_UNTAINTED);
 Ustrcpy(node->name, s);
@@ -89,7 +89,7 @@ node->data.val = h->why;
 if (h->status == hstatus_unusable_expired) node->data.val += 256;
 if (!tree_insertnode(&tree_unusable, node)) store_reset(rpoint);
 }
-
+#endif



/*************************************************
diff --git a/test/runtest b/test/runtest
index 98914d171..e8f1933f2 100755
--- a/test/runtest
+++ b/test/runtest
@@ -500,7 +500,10 @@ RESET_AFTER_EXTRA_LINE_READ:
s/T:(\S+)\s-22\s(\S+)\s/T:$1 -22 xxxx /;

# port numbers in dumpdb output
- s/T:([a-z.]+(:[0-9.]+)?):$parm_port_n /T:$1:PORT_N /;
+ s/T:([a-z0-9.]+(:[0-9.]+|:\[[^]]+])?):$parm_port_n /T:$1:PORT_N /;
+ s/T:([a-z0-9.[\]]+(:[0-9.]+|:\[[^]]+])?):$parm_port_s /T:$1:PORT_S /;
+ # and exinext
+ s/Transport: (?:[a-z0-9.]+|\[[^\]]+]) (?:[0-9.]+|\[[^\]]+]):\K$parm_port_s /PORT_S /;

# port numbers in stderr
s/^set_process_info: .*\]:\K$parm_port_d /PORT_D /;
@@ -821,7 +824,8 @@ RESET_AFTER_EXTRA_LINE_READ:

   # This handles "connection from" and the like, when the port is given
   if (!/listening for SMTP on/ && !/Connecting to/ && !/=>/ && !/->/
-      && !/\*>/&& !/==/  && !/\*\*/ && !/Connection refused/ && !/in response to/)
+      && !/\*>/&& !/==/  && !/\*\*/ && !/Connection refused/ && !/in response to/
+      && !/T(?:ransport)?:/)
     {
     s/\[([a-z\d:]+|\d+(?:\.\d+){3})\]:(\d+)/"[".$1."]:".new_value($2,"%s",\$next_port)/ie;
     }
diff --git a/test/stderr/0388 b/test/stderr/0388
index 784cc3913..92b85e558 100644
--- a/test/stderr/0388
+++ b/test/stderr/0388
@@ -132,11 +132,11 @@ Connecting to V4NET.0.0.0 [V4NET.0.0.0]:PORT_S ... V4NET.0.0.0 in hosts_try_fast
 LOG: MAIN
   H=V4NET.0.0.0 [V4NET.0.0.0] Network Error
 set_process_info: pppp delivering 10HmaX-000000005vi-0000: just tried V4NET.0.0.0 [V4NET.0.0.0]:PORT_S for x@y: result DEFER
-added retry item for T:V4NET.0.0.0:V4NET.0.0.0:PORT_S: errno=dd more_errno=dd,A flags=2
+added retry item for T:[V4NET.0.0.0]:V4NET.0.0.0:PORT_S: errno=dd more_errno=dd,A flags=2
 set_process_info: pppp delivering 10HmaX-000000005vi-0000: waiting for a remote delivery subprocess to finish
 set_process_info: pppp delivering 10HmaX-000000005vi-0000 (just run smtp for x@y in subprocess)
 search_tidyup called
-reading retry information for T:V4NET.0.0.0:V4NET.0.0.0:PORT_S from subprocess
+reading retry information for T:[V4NET.0.0.0]:V4NET.0.0.0:PORT_S from subprocess
   added retry item
 reading retry information for R:x@y from subprocess
   added retry item
@@ -177,14 +177,14 @@ Writing retry data for R:x@y
    list element: *
    V4NET.0.0.0 in "*"? yes (matched "*")
   *@V4NET.0.0.0 in "*"? yes (matched "*")
-retry for T:V4NET.0.0.0:V4NET.0.0.0:PORT_S (y) = * 0 0
- dbfn_read: key=T:V4NET.0.0.0:V4NET.0.0.0:PORT_S
+retry for T:[V4NET.0.0.0]:V4NET.0.0.0:PORT_S (y) = * 0 0
+ dbfn_read: key=T:[V4NET.0.0.0]:V4NET.0.0.0:PORT_S
 failing_interval=ttt message_age=ttt
 on queue longer than maximum retry
-Writing retry data for T:V4NET.0.0.0:V4NET.0.0.0:PORT_S
+Writing retry data for T:[V4NET.0.0.0]:V4NET.0.0.0:PORT_S
   first failed=dddd last try=dddd next try=+0 expired=0
   errno=dd more_errno=dd,A Network Error
- dbfn_write: key=T:V4NET.0.0.0:V4NET.0.0.0:PORT_S
+ dbfn_write: key=T:[V4NET.0.0.0]:V4NET.0.0.0:PORT_S
 timed out: all retries expired
 LOG: MAIN
   ** x@y: retry timeout exceeded
diff --git a/test/stderr/0450 b/test/stderr/0450
index 997954187..1364d55a2 100644
--- a/test/stderr/0450
+++ b/test/stderr/0450
@@ -21,7 +21,7 @@ delivering 10HmaX-000000005vi-0000 to 127.0.0.1 [127.0.0.1] (userx@???)
 Connecting to 127.0.0.1 [127.0.0.1]:PORT_D ...  failed: Connection refused
 LOG: MAIN
   H=127.0.0.1 [127.0.0.1] Connection refused
-added retry item for T:127.0.0.1:127.0.0.1:PORT_D: errno=dd more_errno=dd,A flags=2
+added retry item for T:[127.0.0.1]:127.0.0.1:PORT_D: errno=dd more_errno=dd,A flags=2
 all IP addresses skipped or deferred at least one address
 updating wait-t1 database
 added 10HmaX-000000005vi-0000 to queue for 127.0.0.1
@@ -50,7 +50,7 @@ delivering 10HmaX-000000005vi-0000 to 127.0.0.1 [127.0.0.1] (userx@???)
 Connecting to 127.0.0.1 [127.0.0.1]:PORT_D2 ...  failed: Connection refused
 LOG: MAIN
   H=127.0.0.1 [127.0.0.1] Connection refused
-added retry item for T:127.0.0.1:127.0.0.1:PORT_D2: errno=dd more_errno=dd,A flags=2
+added retry item for T:[127.0.0.1]:127.0.0.1:PORT_D2: errno=dd more_errno=dd,A flags=2
 all IP addresses skipped or deferred at least one address
 updating wait-t1 database
 already listed for 127.0.0.1
diff --git a/test/stderr/0476 b/test/stderr/0476
index 86070390d..d14e2dbd2 100644
--- a/test/stderr/0476
+++ b/test/stderr/0476
@@ -89,7 +89,7 @@ Connecting to 127.0.0.1 [127.0.0.1]:PORT_S ...  failed: Connection refused
 LOG: MAIN
   H=127.0.0.1 [127.0.0.1] Connection refused
 set_process_info: pppp delivering 10HmaZ-000000005vi-0000: just tried 127.0.0.1 [127.0.0.1]:PORT_S for CALLER@???: result DEFER
-added retry item for T:127.0.0.1:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2
+added retry item for T:[127.0.0.1]:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2
 all IP addresses skipped or deferred at least one address
 updating wait-t1 database
 added 10HmaZ-000000005vi-0000 to queue for 127.0.0.1
diff --git a/test/stderr/0512 b/test/stderr/0512
index 18ebdc002..7bb550c81 100644
--- a/test/stderr/0512
+++ b/test/stderr/0512
@@ -18,7 +18,7 @@ hosts_max_try limit reached with this host
 Connecting to 127.0.0.1 [127.0.0.1]:PORT_S ...  failed: Connection refused
 LOG: MAIN
   H=127.0.0.1 [127.0.0.1] Connection refused
-added retry item for T:127.0.0.1:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2
+added retry item for T:[127.0.0.1]:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2
 temporary delivery error(s) override hosts_max_try (message older than host's retry time)
 Clearing TFO as not first host for message
 getting address for 127.0.0.1
@@ -30,7 +30,7 @@ hosts_max_try limit reached with this host
 Connecting to 127.0.0.1 [127.0.0.1]:PORT_S ...  failed: Connection refused
 LOG: MAIN
   H=127.0.0.1 [127.0.0.1] Connection refused
-added retry item for T:127.0.0.1:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2
+added retry item for T:[127.0.0.1]:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2
 temporary delivery error(s) override hosts_max_try (message older than host's retry time)
 Clearing TFO as not first host for message
 getting address for 127.0.0.1
@@ -42,7 +42,7 @@ hosts_max_try limit reached with this host
 Connecting to 127.0.0.1 [127.0.0.1]:PORT_S ...  failed: Connection refused
 LOG: MAIN
   H=127.0.0.1 [127.0.0.1] Connection refused
-added retry item for T:127.0.0.1:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2
+added retry item for T:[127.0.0.1]:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2
 temporary delivery error(s) override hosts_max_try (message older than host's retry time)
 Clearing TFO as not first host for message
 getting address for 127.0.0.1
@@ -54,7 +54,7 @@ hosts_max_try limit reached with this host
 Connecting to 127.0.0.1 [127.0.0.1]:PORT_S ...  failed: Connection refused
 LOG: MAIN
   H=127.0.0.1 [127.0.0.1] Connection refused
-added retry item for T:127.0.0.1:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2
+added retry item for T:[127.0.0.1]:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2
 reached transport hosts_max_try limit 1
 all IP addresses skipped or deferred at least one address
 updating wait-t1 database
@@ -109,7 +109,7 @@ hosts_max_try limit reached with this host
 Connecting to 127.0.0.1 [127.0.0.1]:PORT_S ...  failed: Connection refused
 LOG: MAIN
   H=127.0.0.1 [127.0.0.1] Connection refused
-added retry item for T:127.0.0.1:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2
+added retry item for T:[127.0.0.1]:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2
 temporary delivery error(s) override hosts_max_try (message older than host's retry time)
 Clearing TFO as not first host for message
 getting address for 127.0.0.1
@@ -121,7 +121,7 @@ hosts_max_try limit reached with this host
 Connecting to 127.0.0.1 [127.0.0.1]:PORT_S ...  failed: Connection refused
 LOG: MAIN
   H=127.0.0.1 [127.0.0.1] Connection refused
-added retry item for T:127.0.0.1:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2
+added retry item for T:[127.0.0.1]:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2
 temporary delivery error(s) override hosts_max_try (message older than host's retry time)
 reached transport hosts_max_try_hardlimit limit 2
 all IP addresses skipped or deferred at least one address
diff --git a/test/stderr/0623 b/test/stderr/0623
index ce3804c13..bb517b859 100644
--- a/test/stderr/0623
+++ b/test/stderr/0623
@@ -55,7 +55,7 @@ ok=0 send_quit=0 send_rset=1 continue_more=0 yield=0 first_address is NULL
   SMTP<< 221 Closing connection
   SMTP(close)>>
 cmdlog: '220:EHLO:250-:MAIL|:RCPT|:DATA:250:250:300:.:QUIT+:451:221'
-added retry item for T:127.0.0.1:127.0.0.1:PORT_D:10HmaZ-000000005vi-0000: errno=-46 more_errno=dd,A flags=6
+added retry item for T:[127.0.0.1]:127.0.0.1:PORT_D:10HmaZ-000000005vi-0000: errno=-46 more_errno=dd,A flags=6
 all IP addresses skipped or deferred at least one address
 Leaving send_to_server transport
 LOG: MAIN
@@ -187,7 +187,7 @@ ok=0 send_quit=0 send_rset=1 continue_more=0 yield=0 first_address is NULL
   SMTP(closed)<<
   SMTP(close)>>
 cmdlog: '220:EHLO:250-:MAIL|:RCPT|:DATA:250:250:300:.:QUIT+'
-added retry item for T:127.0.0.1:127.0.0.1:PORT_D:10HmbB-000000005vi-0000: errno=-18 more_errno=dd,A flags=6
+added retry item for T:[127.0.0.1]:127.0.0.1:PORT_D:10HmbB-000000005vi-0000: errno=-18 more_errno=dd,A flags=6
 all IP addresses skipped or deferred at least one address
 Leaving send_to_server transport
 LOG: MAIN
diff --git a/test/stderr/0909 b/test/stderr/0909
index 4d744afd0..730dc2c0a 100644
--- a/test/stderr/0909
+++ b/test/stderr/0909
@@ -189,7 +189,7 @@ ok=0 send_quit=0 send_rset=1 continue_more=0 yield=0 first_address is NULL
   SMTP<< 221 Closing connection
   SMTP(close)>>
 cmdlog: '220:EHLO:250-:MAIL|:RCPT|:BDAT+:QUIT+:250:250:451:221'
-added retry item for T:127.0.0.1:127.0.0.1:PORT_D:10HmaZ-000000005vi-0000: errno=-46 more_errno=dd,A flags=6
+added retry item for T:[127.0.0.1]:127.0.0.1:PORT_D:10HmaZ-000000005vi-0000: errno=-46 more_errno=dd,A flags=6
 all IP addresses skipped or deferred at least one address
 Leaving send_to_server transport
 LOG: MAIN
@@ -329,7 +329,7 @@ ok=0 send_quit=0 send_rset=1 continue_more=0 yield=0 first_address is NULL
   SMTP(closed)<<
   SMTP(close)>>
 cmdlog: '220:EHLO:250-:MAIL|:RCPT|:BDAT+:QUIT+:250:250'
-added retry item for T:127.0.0.1:127.0.0.1:PORT_D:10HmbB-000000005vi-0000: errno=-18 more_errno=dd,A flags=6
+added retry item for T:[127.0.0.1]:127.0.0.1:PORT_D:10HmbB-000000005vi-0000: errno=-18 more_errno=dd,A flags=6
 all IP addresses skipped or deferred at least one address
 Leaving send_to_server transport
 LOG: MAIN
diff --git a/test/stdout/0213 b/test/stdout/0213
index d3dd7cffc..4647ccbed 100644
--- a/test/stdout/0213
+++ b/test/stdout/0213
@@ -1,5 +1,5 @@
 +++++++++++++++++++++++++++
-  T:127.0.0.1:127.0.0.1:1224 -19 65 H=127.0.0.1 [127.0.0.1]: Malformed SMTP reply in response to RCPT TO:<userx@domain1>: 550 The answer is no, but I am going to make sure it is a very l
+  T:[127.0.0.1]:127.0.0.1:PORT_S -19 65 H=127.0.0.1 [127.0.0.1]: Malformed SMTP reply in response to RCPT TO:<userx@domain1>: 550 The answer is no, but I am going to make sure it is a very l
 first failed = time last try = time2 next try = time2 + 3600


******** SERVER ********
diff --git a/test/stdout/0343 b/test/stdout/0343
index dbcd79079..37752fc5f 100644
--- a/test/stdout/0343
+++ b/test/stdout/0343
@@ -1,6 +1,6 @@
+++++++++++++++++++++++++++
- T:127.0.0.1:127.0.0.1:1223 dd 65 Connection refused
+ T:[127.0.0.1]:127.0.0.1:1223 dd 65 Connection refused
first failed = time last try = time2 next try = time2 + 600
+++++++++++++++++++++++++++
- T:127.0.0.1:127.0.0.1:1223 dd 65 Connection refused
+ T:[127.0.0.1]:127.0.0.1:1223 dd 65 Connection refused
first failed = time last try = time2 next try = time2 + 600
diff --git a/test/stdout/0447 b/test/stdout/0447
index caecaea8a..9b4f1785d 100644
--- a/test/stdout/0447
+++ b/test/stdout/0447
@@ -4,13 +4,13 @@ Retry rule: * timeout_connect F,1d,1m;
Retry rule: * timeout_A F,1d,30s;
Retry rule: * timeout_connect_A F,1d,29s;
+++++++++++++++++++++++++++
- T:127.0.0.1:127.0.0.1:1224 dd 321 Connection timed out
+ T:[127.0.0.1]:127.0.0.1:PORT_S dd 321 Connection timed out
first failed = time last try = time2 next try = time2 + 60
+++++++++++++++++++++++++++
- T:127.0.0.1:127.0.0.1:1224 dd 321 Connection timed out
+ T:[127.0.0.1]:127.0.0.1:PORT_S dd 321 Connection timed out
first failed = time last try = time2 next try = time2 + 30
+++++++++++++++++++++++++++
- T:127.0.0.1:127.0.0.1:1224 dd 321 Connection timed out
+ T:[127.0.0.1]:127.0.0.1:PORT_S dd 321 Connection timed out
first failed = time last try = time2 next try = time2 + 30
+++++++++++++++++++++++++++
R:xx.test.again.dns -1 0 host lookup did not complete
diff --git a/test/stdout/0450 b/test/stdout/0450
index 2da7c051e..640292415 100644
--- a/test/stdout/0450
+++ b/test/stdout/0450
@@ -1,5 +1,5 @@
+++++++++++++++++++++++++++
- T:127.0.0.1:127.0.0.1:1225 dd 65 Connection refused
+ T:[127.0.0.1]:127.0.0.1:1225 dd 65 Connection refused
first failed = time last try = time2 next try = time2 + 600
- T:127.0.0.1:127.0.0.1:1226 dd 65 Connection refused
+ T:[127.0.0.1]:127.0.0.1:1226 dd 65 Connection refused
first failed = time last try = time2 next try = time2 + 600
diff --git a/test/stdout/0474 b/test/stdout/0474
index b4ae3cce2..4491500a7 100644
--- a/test/stdout/0474
+++ b/test/stdout/0474
@@ -1,8 +1,8 @@
+++++++++++++++++++++++++++
- T:127.0.0.1:127.0.0.1:1224:10HmaX-000000005vi-0000 0 65 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after end of data: 850 NONSENSE
+ T:[127.0.0.1]:127.0.0.1:1224:10HmaX-000000005vi-0000 0 65 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after end of data: 850 NONSENSE
first failed = time last try = time2 next try = time2 + 10
+++++++++++++++++++++++++++
- T:127.0.0.1:127.0.0.1:1224:10HmaX-000000005vi-0000 0 65 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after MAIL FROM:<CALLER@???>: 850 RUBBISH
+ T:[127.0.0.1]:127.0.0.1:1224:10HmaX-000000005vi-0000 0 65 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after MAIL FROM:<CALLER@???>: 850 RUBBISH
first failed = time last try = time2 next try = time2 + 10
+++++++++++++++++++++++++++
R:abcd@xyz:<CALLER@???> -44 12865 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after RCPT TO:<abcd@xyz>: 850 RUBBISH
diff --git a/test/stdout/0497 b/test/stdout/0497
index ac02261ac..acba7c8db 100644
--- a/test/stdout/0497
+++ b/test/stdout/0497
@@ -1,5 +1,5 @@
+++++++++++++++++++++++++++
- T:127.0.0.1:127.0.0.1:1224:10HmaX-000000005vi-0000 -45 13377 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after MAIL FROM:<CALLER@???>: 452 temporary error
+ T:[127.0.0.1]:127.0.0.1:1224:10HmaX-000000005vi-0000 -45 13377 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after MAIL FROM:<CALLER@???>: 452 temporary error
first failed = time last try = time2 next try = time2 + 0 *
+++++++++++++++++++++++++++
R:userx@???:<CALLER@???> -44 13377 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after RCPT TO:<userx@???>: 452 temporary error
diff --git a/test/stdout/0498 b/test/stdout/0498
index 727e2a2fb..635730dc9 100644
--- a/test/stdout/0498
+++ b/test/stdout/0498
@@ -1,5 +1,5 @@
+++++++++++++++++++++++++++
- T:127.0.0.1:127.0.0.1:1224:10HmaX-000000005vi-0000 -45 12865 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after MAIL FROM:<CALLER@???>: 450 DELAY
+ T:[127.0.0.1]:127.0.0.1:1224:10HmaX-000000005vi-0000 -45 12865 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after MAIL FROM:<CALLER@???>: 450 DELAY
first failed = time last try = time2 next try = time2 + 10

******** SERVER ********
diff --git a/test/stdout/0610 b/test/stdout/0610
index 48ce1dee0..5fc87bef2 100644
--- a/test/stdout/0610
+++ b/test/stdout/0610
@@ -11,9 +11,9 @@
250 OK id=10HmaY-000000005vi-0000
221 the.local.host.name closing connection
+++++++++++++++++++++++++++
- T:127.0.0.1:127.0.0.1:1225/127.0.0.1 0 65 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after initial connection: 451 Temporary local problem - please try later
+ T:[127.0.0.1]:127.0.0.1:1225/127.0.0.1 0 65 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after initial connection: 451 Temporary local problem - please try later
first failed = time last try = time2 next try = time2 + 2
- T:127.0.0.1:127.0.0.1:1225/ip4.ip4.ip4.ip4 0 65 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after initial connection: 451 Temporary local problem - please try later
+ T:[127.0.0.1]:127.0.0.1:1225/ip4.ip4.ip4.ip4 0 65 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after initial connection: 451 Temporary local problem - please try later
first failed = time last try = time2 next try = time2 + 2
+++++++++++++++++++++++++++
+++++++++++++++++++++++++++
diff --git a/test/stdout/1008 b/test/stdout/1008
index 0fb622a03..42485be93 100644
--- a/test/stdout/1008
+++ b/test/stdout/1008
@@ -1,18 +1,14 @@
+++++++++++++++++++++++++++
- T:127.0.0.1:127.0.0.1:1224:10HmaX-000000005vi-0000 -45 12865 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after MAIL FROM:<CALLER@???>: 450 Temporary error
+ T:[127.0.0.1]:127.0.0.1:1224:10HmaX-000000005vi-0000 -45 12865 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after MAIL FROM:<CALLER@???>: 450 Temporary error
first failed = time last try = time2 next try = time2 + 7200
- T:::1:::1:1224:10HmaX-000000005vi-0000 -45 12865 H=::1 [::1]: SMTP error from remote mail server after MAIL FROM:<CALLER@???>: 450 Temporary error
+ T:[::1]:[::1]:1224:10HmaX-000000005vi-0000 -45 12865 H=::1 [::1]: SMTP error from remote mail server after MAIL FROM:<CALLER@???>: 450 Temporary error
first failed = time last try = time2 next try = time2 + 7200
-Transport: 127.0.0.1 [127.0.0.1]:1111 10HmaX-000000005vi-0000 error -45: H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after MAIL FROM:<CALLER@???>: 450 Temporary error
- first failed: 07-Mar-2000 12:21:52
- last tried: 07-Mar-2000 12:21:52
- next try at: 07-Mar-2000 12:21:52
-Transport: [:1:::1:1224:10HmaX-000000005vi-0000]:1224 10HmaX-000000005vi-0000 error -45: H=::1 [::1]: SMTP error from remote mail server after MAIL FROM:<CALLER@???>: 450 Temporary error
+Transport: [127.0.0.1] 127.0.0.1:PORT_S 10HmaX-000000005vi-0000 error -45: H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after MAIL FROM:<CALLER@???>: 450 Temporary error
first failed: 07-Mar-2000 12:21:52
last tried: 07-Mar-2000 12:21:52
next try at: 07-Mar-2000 12:21:52
exinext exit code = 0
-Transport: [:1:::1:1224:10HmaX-000000005vi-0000] error -45: H=::1 [::1]: SMTP error from remote mail server after MAIL FROM:<CALLER@???>: 450 Temporary error
+Transport: [::1] [::1]:PORT_S 10HmaX-000000005vi-0000 error -45: H=::1 [::1]: SMTP error from remote mail server after MAIL FROM:<CALLER@???>: 450 Temporary error
first failed: 07-Mar-2000 12:21:52
last tried: 07-Mar-2000 12:21:52
next try at: 07-Mar-2000 12:21:52

--
## subscription configuration (requires account):
## https://lists.exim.org/mailman3/postorius/lists/exim-cvs.lists.exim.org/
## unsubscribe (doesn't require an account):
## exim-cvs-unsubscribe@???
## Exim details at http://www.exim.org/
## Please use the Wiki with this list - http://wiki.exim.org/