From: Jeremy Harris Date: Wed, 6 Dec 2023 19:54:40 +0000 (+0000) Subject: Logging: ensure that an error for a mistyped IPv6 address in a search X-Git-Url: https://git.exim.org/exim.git/commitdiff_plain/b0e63c7efdc2133c61545b051042d3617ecd2bbd Logging: ensure that an error for a mistyped IPv6 address in a search list is available for logging. Bug 3057 --- diff --git a/doc/doc-docbook/spec.xfpt b/doc/doc-docbook/spec.xfpt index 6022d7642..dc8f5cc4d 100644 --- a/doc/doc-docbook/spec.xfpt +++ b/doc/doc-docbook/spec.xfpt @@ -39097,7 +39097,7 @@ selection marked by asterisks: .irow &`tls_peerdn`&   "TLS peer DN on <= and => lines" .irow &`tls_resumption`&   "append * to cipher field" .irow &`tls_sni`&   "TLS SNI on <= lines" -.irow &`unknown_in_list`&   "DNS lookup failed in list match" +.irow &`unknown_in_list`&   "lookup failed in list match" .irow &`all`&   "&*all of the above*&" .endtable See also the &%slow_lookup_log%& main configuration option, @@ -39516,7 +39516,8 @@ added to the log line, preceded by SNI=. .next .cindex "log" "DNS failure in list" &%unknown_in_list%&: This setting causes a log entry to be written when the -result of a list match is failure because a DNS lookup failed. +result of a list match is failure because a DNS lookup failed, or because +a bad IP address was in the list. .endlist diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog index 369e95120..2d82df43d 100644 --- a/doc/doc-txt/ChangeLog +++ b/doc/doc-txt/ChangeLog @@ -44,6 +44,11 @@ JH/08 Bug 3056: Tighten up parsing of DKIM DNS records. Previously, whitespace Tighten parsing of DKIM header records. Previously, all but lowercase alpha chars would be ignored in potential tag names. +JH/09 Bug 3057: Add heuristic for spotting mistyped IPv6 addresses in lists + being searched. Previously we only had one for IPv4 addresses. Per the + documentation, the error results by default in a no-match result for the + list. It is logged if the unknown_in_list log_selector is used. + Exim version 4.97 diff --git a/src/src/match.c b/src/src/match.c index df440108e..8b1a3bef6 100644 --- a/src/src/match.c +++ b/src/src/match.c @@ -886,14 +886,19 @@ while ((sss = string_nextinlist(&list, &sep, NULL, 0))) log_write(0, LOG_MAIN, "%s: accepted by +include_defer", error); goto OK_RETURN; - case ERROR: /* host name lookup failed - this can only */ - if (ignore_unknown) /* be for an incoming host (not outgoing) */ + /* The ERROR return occurs when checking hosts, when either a forward + or reverse lookup has failed. It can also occur in a match_ip list if a + non-IP address item is encountered. The error string gives details of + which it was. */ + + case ERROR: + if (ignore_unknown) { HDEBUG(D_lists) debug_printf_indent("%s: item ignored by +ignore_unknown\n", error); } else - { + { HDEBUG(D_lists) debug_printf_indent("%s %s (%s)\n", ot, include_unknown? "yes":"no", error); (void)fclose(f); diff --git a/src/src/string.c b/src/src/string.c index dfe0f2451..3bf2f1df7 100644 --- a/src/src/string.c +++ b/src/src/string.c @@ -57,6 +57,7 @@ union { /* we do not need this, but inet_pton() needs a place for storage */ we return failure, as we do if the mask isn't a pure numerical value, or if it is negative. The actual length is checked later, once we know the address family. */ + if (slash = Ustrchr(ip_addr, '/')) { uschar * rest; @@ -74,10 +75,11 @@ if (slash = Ustrchr(ip_addr, '/')) return 0; } - *maskptr = slash - ip_addr; /* offset of the slash */ + *maskptr = slash - ip_addr; /* offset of the slash */ endp = slash; } -else if (maskptr) *maskptr = 0; /* no slash found */ +else if (maskptr) + *maskptr = 0; /* no slash found */ /* The interface-ID suffix (%) is optional (for IPv6). If it exists, we check it syntactically. Later, if we know the address @@ -160,7 +162,7 @@ switch (af) int string_is_ip_address(const uschar * ip_addr, int * maskptr) { -return string_is_ip_addressX(ip_addr, maskptr, 0); +return string_is_ip_addressX(ip_addr, maskptr, NULL); } #endif /* COMPILE_UTILITY */ diff --git a/src/src/verify.c b/src/src/verify.c index d080ddd63..194e9a76a 100644 --- a/src/src/verify.c +++ b/src/src/verify.c @@ -2971,7 +2971,7 @@ if (*ss == '@') a (possibly masked) comparison with the current IP address. */ if (string_is_ip_address(ss, &maskoffset) != 0) - return (host_is_in_net(cb->host_address, ss, maskoffset)? OK : FAIL); + return host_is_in_net(cb->host_address, ss, maskoffset) ? OK : FAIL; /* The pattern is not an IP address. A common error that people make is to omit one component of an IPv4 address, either by accident, or believing that, for @@ -2982,13 +2982,25 @@ ancient specification.) To aid in debugging these cases, we give a specific error if the pattern contains only digits and dots or contains a slash preceded only by digits and dots (a slash at the start indicates a file name and of course slashes may be present in lookups, but not preceded only by digits and -dots). */ +dots). Then the equivalent for IPv6 (roughly). */ -for (t = ss; isdigit(*t) || *t == '.'; ) t++; -if (!*t || (*t == '/' && t != ss)) +if (Ustrchr(ss, ':')) { - *error = string_sprintf("malformed IPv4 address or address mask: %.*s", (int)(t - ss), ss); - return ERROR; + for (t = ss; isxdigit(*t) || *t == ':' || *t == '.'; ) t++; + if (!*t || (*t == '/' || *t == '%') && t != ss) + { + *error = string_sprintf("malformed IPv6 address or address mask: %.*s", (int)(t - ss), ss); + return ERROR; + } + } +else + { + for (t = ss; isdigit(*t) || *t == '.'; ) t++; + if (!*t || (*t == '/' && t != ss)) + { + *error = string_sprintf("malformed IPv4 address or address mask: %.*s", (int)(t - ss), ss); + return ERROR; + } } /* See if there is a semicolon in the pattern, separating a searchtype diff --git a/test/confs/0475 b/test/confs/0475 index dfca55c78..58eb42052 100644 --- a/test/confs/0475 +++ b/test/confs/0475 @@ -7,6 +7,7 @@ acl_smtp_rcpt = $local_part +log_selector = +unknown_in_list # ----- ACL ----- @@ -18,4 +19,10 @@ a1: a2: deny hosts = 1.2.3/24 +a3: + deny hosts = <; fe80::1 + +a4: + deny hosts = <; fe80:1 + # End diff --git a/test/scripts/0000-Basic/0002 b/test/scripts/0000-Basic/0002 index c1fa1bdb5..9b1e5120e 100644 --- a/test/scripts/0000-Basic/0002 +++ b/test/scripts/0000-Basic/0002 @@ -418,7 +418,7 @@ mask: ${if eq {1}{2}{${mask:invalid}}{NO}} 5>3m: ${if >{5 } {3m }{y}{n}} 5>3z: ${if >{5 } {3z }{y}{n}} 5>a: ${if >{ 5 } {a}{y}{n}} -5>bad: ${if >{5 } {${lookup{trick}lsearch{DIR/aux-fixed/0002.lsearch}}} {y}{n}} +5>bad: ${if >{5 } {${lookup{trick}lsearch{DIR/aux-fixed/TESTNUM.lsearch}}} {y}{n}} >0: ${if > {}{0}{y}{n}} =: ${if = {}{}{y}{n}} @@ -472,6 +472,7 @@ isip6: ${if isip6{::1}{y}{n}} ::1 isip: ${if isip {fe80::a00:20ff:fe86:a061}{y}{n}} fe80::a00:20ff:fe86:a061 isip4: ${if isip4{fe80::a00:20ff:fe86:a061}{y}{n}} fe80::a00:20ff:fe86:a061 isip6: ${if isip6{fe80::a00:20ff:fe86:a061}{y}{n}} fe80::a00:20ff:fe86:a061 +isip6: ${if isip6{fe80:a00:20ff:fe86:a061}{y}{n}} fe80:a00:20ff:fe86:a061 isip: ${if isip {fe80::1.2.3.4}{y}{n}} fe80::1.2.3.4 isip: ${if isip {rhubarb}{y}{n}} rhubarb isip4: ${if isip4{rhubarb}{y}{n}} rhubarb @@ -527,10 +528,10 @@ match_ip: 08 ${if match_ip{V4NET.11.12.13}{+hlist}} match_ip: 09 ${if match_ip{V4NET.11.12.14}{+hlist}} match_ip: 10 ${if match_ip{192.168.3.4}{+hlist}} match_ip: 11 ${if match_ip{somename}{+hlist}} -match_ip: 12 ${if match_ip{1.2.3.4}{lsearch;DIR/aux-fixed/0002.matchip}} -match_ip: 13 ${if match_ip{1.2.3.4}{net-lsearch;DIR/aux-fixed/0002.matchip}} -match_ip: 14 ${if match_ip{5.6.7.8}{net24-lsearch;DIR/aux-fixed/0002.matchip}} -match_ip: 15 ${if match_ip{abcd::dcba}{net-iplsearch;DIR/aux-fixed/0002.matchip}} +match_ip: 12 ${if match_ip{1.2.3.4}{lsearch;DIR/aux-fixed/TESTNUM.matchip}} +match_ip: 13 ${if match_ip{1.2.3.4}{net-lsearch;DIR/aux-fixed/TESTNUM.matchip}} +match_ip: 14 ${if match_ip{5.6.7.8}{net24-lsearch;DIR/aux-fixed/TESTNUM.matchip}} +match_ip: 15 ${if match_ip{abcd::dcba}{net-iplsearch;DIR/aux-fixed/TESTNUM.matchip}} queue_running: ${if queue_running{y}{n}} first_delivery: ${if first_delivery{y}{n}} @@ -552,126 +553,126 @@ acl if: ${if acl {{a_defer}{argN}{arg2}} {Y:$value}{N:$value}} # Lookups: DIR is the testing directory. In this test we can only use the # lookups that are required in all cases. -${lookup{postmaster}lsearch {DIR/aux-fixed/0002.aliases}{$value}fail} -${lookup{postmaster}lsearch,ret=full{DIR/aux-fixed/0002.aliases}{$value}fail} - -${lookup{x@y}lsearch*@{DIR/aux-fixed/0002.starat}{$value}fail} -${lookup{x@z}lsearch* {DIR/aux-fixed/0002.starat}{$value}fail} -${lookup{x@z}lsearch*@{DIR/aux-fixed/0002.starat}{$value}fail} -${lookup{x@w}lsearch*@{DIR/aux-fixed/0002.starat}{$value}fail} - -${lookup{x@y}lsearch*@,ret=full {DIR/aux-fixed/0002.starat}{$value}fail} -${lookup{x@z}lsearch*,ret=full {DIR/aux-fixed/0002.starat}{$value}fail} -${lookup{x@z}lsearch*@,ret=full {DIR/aux-fixed/0002.starat}{$value}fail} -${lookup{x@w}lsearch*@,ret=full {DIR/aux-fixed/0002.starat}{$value}fail} - -${lookup{a.b.c.d} partial-lsearch {DIR/aux-fixed/0002.domains}{$value}fail} -${lookup{x.y.z} partial-lsearch {DIR/aux-fixed/0002.domains}{$value}{failed x.y.z}} -${lookup{p.q} partial-lsearch {DIR/aux-fixed/0002.domains}{$value}fail} -${lookup{o.p.q} partial-lsearch {DIR/aux-fixed/0002.domains}{$value}fail} -${lookup{m.n.o.p.q}partial-lsearch {DIR/aux-fixed/0002.domains}{$value}fail} -${lookup{x.y.z} partial1-lsearch{DIR/aux-fixed/0002.domains}{$value}fail} -${lookup{x.y.z} partial0-lsearch{DIR/aux-fixed/0002.domains}{$value}fail} - -${lookup{a.b.c.d} partial-lsearch,ret=full {DIR/aux-fixed/0002.domains}{$value}fail} -${lookup{x.y.z} partial-lsearch,ret=full {DIR/aux-fixed/0002.domains}{$value}{failed x.y.z}} -${lookup{p.q} partial-lsearch,ret=full {DIR/aux-fixed/0002.domains}{$value}fail} -${lookup{o.p.q} partial-lsearch,ret=full {DIR/aux-fixed/0002.domains}{$value}fail} -${lookup{m.n.o.p.q}partial-lsearch,ret=full {DIR/aux-fixed/0002.domains}{$value}fail} -${lookup{x.y.z} partial1-lsearch,ret=full{DIR/aux-fixed/0002.domains}{$value}fail} -${lookup{x.y.z} partial0-lsearch,ret=full{DIR/aux-fixed/0002.domains}{$value}fail} - -q1: ${lookup{abc} lsearch{DIR/aux-fixed/0002.quoted}} -q2: ${lookup{xyz} lsearch{DIR/aux-fixed/0002.quoted}} -q3: ${lookup{pqr} lsearch{DIR/aux-fixed/0002.quoted}} -q4: ${lookup{a:b} lsearch{DIR/aux-fixed/0002.quoted}} -q5: ${lookup{"quoted"} lsearch{DIR/aux-fixed/0002.quoted}} -q6: ${lookup{white space}lsearch{DIR/aux-fixed/0002.quoted}} -q7: ${lookup{b\\s} lsearch{DIR/aux-fixed/0002.quoted}} - -q1f: ${lookup{abc} lsearch,ret=full{DIR/aux-fixed/0002.quoted}} -q2f: ${lookup{xyz} lsearch,ret=full{DIR/aux-fixed/0002.quoted}} -q3f: ${lookup{pqr} lsearch,ret=full{DIR/aux-fixed/0002.quoted}} -q4f: ${lookup{a:b} lsearch,ret=full{DIR/aux-fixed/0002.quoted}} -q5f: ${lookup{"quoted"} lsearch,ret=full{DIR/aux-fixed/0002.quoted}} -q6f: ${lookup{white space}lsearch,ret=full{DIR/aux-fixed/0002.quoted}} -q7f: ${lookup{b\\s} lsearch,ret=full{DIR/aux-fixed/0002.quoted}} - -abc: ${lookup{abc}wildlsearch{DIR/aux-var/0002.wild}} -a.b.c: ${lookup{a.b.c}wildlsearch{DIR/aux-var/0002.wild}} -ab.c: ${lookup{ab.c}wildlsearch{DIR/aux-var/0002.wild}} -xyz: ${lookup{xyz}wildlsearch{DIR/aux-var/0002.wild}} -.Xyz: ${lookup{Xyz}wildlsearch{DIR/aux-var/0002.wild}} -.Zyz: ${lookup{Zyz}wildlsearch{DIR/aux-var/0002.wild}} -a b: ${lookup{a b}wildlsearch{DIR/aux-var/0002.wild}} -a b: ${lookup{a b}wildlsearch{DIR/aux-var/0002.wild}} -a:b: ${lookup{a:b}wildlsearch{DIR/aux-var/0002.wild}} -a.b: ${lookup{a.b}wildlsearch{DIR/aux-var/0002.wild}} -a..b: ${lookup{a..b}wildlsearch{DIR/aux-var/0002.wild}} -a9b: ${lookup{a9b}wildlsearch{DIR/aux-var/0002.wild}} -a99b: ${lookup{a99b}wildlsearch{DIR/aux-var/0002.wild}} +${lookup{postmaster}lsearch {DIR/aux-fixed/TESTNUM.aliases}{$value}fail} +${lookup{postmaster}lsearch,ret=full{DIR/aux-fixed/TESTNUM.aliases}{$value}fail} + +${lookup{x@y}lsearch*@{DIR/aux-fixed/TESTNUM.starat}{$value}fail} +${lookup{x@z}lsearch* {DIR/aux-fixed/TESTNUM.starat}{$value}fail} +${lookup{x@z}lsearch*@{DIR/aux-fixed/TESTNUM.starat}{$value}fail} +${lookup{x@w}lsearch*@{DIR/aux-fixed/TESTNUM.starat}{$value}fail} + +${lookup{x@y}lsearch*@,ret=full {DIR/aux-fixed/TESTNUM.starat}{$value}fail} +${lookup{x@z}lsearch*,ret=full {DIR/aux-fixed/TESTNUM.starat}{$value}fail} +${lookup{x@z}lsearch*@,ret=full {DIR/aux-fixed/TESTNUM.starat}{$value}fail} +${lookup{x@w}lsearch*@,ret=full {DIR/aux-fixed/TESTNUM.starat}{$value}fail} + +${lookup{a.b.c.d} partial-lsearch {DIR/aux-fixed/TESTNUM.domains}{$value}fail} +${lookup{x.y.z} partial-lsearch {DIR/aux-fixed/TESTNUM.domains}{$value}{failed x.y.z}} +${lookup{p.q} partial-lsearch {DIR/aux-fixed/TESTNUM.domains}{$value}fail} +${lookup{o.p.q} partial-lsearch {DIR/aux-fixed/TESTNUM.domains}{$value}fail} +${lookup{m.n.o.p.q}partial-lsearch {DIR/aux-fixed/TESTNUM.domains}{$value}fail} +${lookup{x.y.z} partial1-lsearch{DIR/aux-fixed/TESTNUM.domains}{$value}fail} +${lookup{x.y.z} partial0-lsearch{DIR/aux-fixed/TESTNUM.domains}{$value}fail} + +${lookup{a.b.c.d} partial-lsearch,ret=full {DIR/aux-fixed/TESTNUM.domains}{$value}fail} +${lookup{x.y.z} partial-lsearch,ret=full {DIR/aux-fixed/TESTNUM.domains}{$value}{failed x.y.z}} +${lookup{p.q} partial-lsearch,ret=full {DIR/aux-fixed/TESTNUM.domains}{$value}fail} +${lookup{o.p.q} partial-lsearch,ret=full {DIR/aux-fixed/TESTNUM.domains}{$value}fail} +${lookup{m.n.o.p.q}partial-lsearch,ret=full {DIR/aux-fixed/TESTNUM.domains}{$value}fail} +${lookup{x.y.z} partial1-lsearch,ret=full{DIR/aux-fixed/TESTNUM.domains}{$value}fail} +${lookup{x.y.z} partial0-lsearch,ret=full{DIR/aux-fixed/TESTNUM.domains}{$value}fail} + +q1: ${lookup{abc} lsearch{DIR/aux-fixed/TESTNUM.quoted}} +q2: ${lookup{xyz} lsearch{DIR/aux-fixed/TESTNUM.quoted}} +q3: ${lookup{pqr} lsearch{DIR/aux-fixed/TESTNUM.quoted}} +q4: ${lookup{a:b} lsearch{DIR/aux-fixed/TESTNUM.quoted}} +q5: ${lookup{"quoted"} lsearch{DIR/aux-fixed/TESTNUM.quoted}} +q6: ${lookup{white space}lsearch{DIR/aux-fixed/TESTNUM.quoted}} +q7: ${lookup{b\\s} lsearch{DIR/aux-fixed/TESTNUM.quoted}} + +q1f: ${lookup{abc} lsearch,ret=full{DIR/aux-fixed/TESTNUM.quoted}} +q2f: ${lookup{xyz} lsearch,ret=full{DIR/aux-fixed/TESTNUM.quoted}} +q3f: ${lookup{pqr} lsearch,ret=full{DIR/aux-fixed/TESTNUM.quoted}} +q4f: ${lookup{a:b} lsearch,ret=full{DIR/aux-fixed/TESTNUM.quoted}} +q5f: ${lookup{"quoted"} lsearch,ret=full{DIR/aux-fixed/TESTNUM.quoted}} +q6f: ${lookup{white space}lsearch,ret=full{DIR/aux-fixed/TESTNUM.quoted}} +q7f: ${lookup{b\\s} lsearch,ret=full{DIR/aux-fixed/TESTNUM.quoted}} + +abc: ${lookup{abc}wildlsearch{DIR/aux-var/TESTNUM.wild}} +a.b.c: ${lookup{a.b.c}wildlsearch{DIR/aux-var/TESTNUM.wild}} +ab.c: ${lookup{ab.c}wildlsearch{DIR/aux-var/TESTNUM.wild}} +xyz: ${lookup{xyz}wildlsearch{DIR/aux-var/TESTNUM.wild}} +.Xyz: ${lookup{Xyz}wildlsearch{DIR/aux-var/TESTNUM.wild}} +.Zyz: ${lookup{Zyz}wildlsearch{DIR/aux-var/TESTNUM.wild}} +a b: ${lookup{a b}wildlsearch{DIR/aux-var/TESTNUM.wild}} +a b: ${lookup{a b}wildlsearch{DIR/aux-var/TESTNUM.wild}} +a:b: ${lookup{a:b}wildlsearch{DIR/aux-var/TESTNUM.wild}} +a.b: ${lookup{a.b}wildlsearch{DIR/aux-var/TESTNUM.wild}} +a..b: ${lookup{a..b}wildlsearch{DIR/aux-var/TESTNUM.wild}} +a9b: ${lookup{a9b}wildlsearch{DIR/aux-var/TESTNUM.wild}} +a99b: ${lookup{a99b}wildlsearch{DIR/aux-var/TESTNUM.wild}} # Should give the same results as above because expansion does nothing -abc: ${lookup{abc}nwildlsearch{DIR/aux-var/0002.wild}} -a.b.c: ${lookup{a.b.c}nwildlsearch{DIR/aux-var/0002.wild}} -ab.c: ${lookup{ab.c}nwildlsearch{DIR/aux-var/0002.wild}} -xyz: ${lookup{xyz}nwildlsearch{DIR/aux-var/0002.wild}} -.Xyz: ${lookup{Xyz}nwildlsearch{DIR/aux-var/0002.wild}} -.Zyz: ${lookup{Zyz}nwildlsearch{DIR/aux-var/0002.wild}} -a b: ${lookup{a b}nwildlsearch{DIR/aux-var/0002.wild}} -a b: ${lookup{a b}nwildlsearch{DIR/aux-var/0002.wild}} -a:b: ${lookup{a:b}nwildlsearch{DIR/aux-var/0002.wild}} +abc: ${lookup{abc}nwildlsearch{DIR/aux-var/TESTNUM.wild}} +a.b.c: ${lookup{a.b.c}nwildlsearch{DIR/aux-var/TESTNUM.wild}} +ab.c: ${lookup{ab.c}nwildlsearch{DIR/aux-var/TESTNUM.wild}} +xyz: ${lookup{xyz}nwildlsearch{DIR/aux-var/TESTNUM.wild}} +.Xyz: ${lookup{Xyz}nwildlsearch{DIR/aux-var/TESTNUM.wild}} +.Zyz: ${lookup{Zyz}nwildlsearch{DIR/aux-var/TESTNUM.wild}} +a b: ${lookup{a b}nwildlsearch{DIR/aux-var/TESTNUM.wild}} +a b: ${lookup{a b}nwildlsearch{DIR/aux-var/TESTNUM.wild}} +a:b: ${lookup{a:b}nwildlsearch{DIR/aux-var/TESTNUM.wild}} # Should fail because of no expansion -a.b: ${lookup{a.b}nwildlsearch{DIR/aux-var/0002.wild}{$value}{NO}} -a..b: ${lookup{a..b}nwildlsearch{DIR/aux-var/0002.wild}{$value}{NO}} -a9b: ${lookup{a9b}nwildlsearch{DIR/aux-var/0002.wild}{$value}{NO}} -a99b: ${lookup{a99b}nwildlsearch{DIR/aux-var/0002.wild}{$value}{NO}} +a.b: ${lookup{a.b}nwildlsearch{DIR/aux-var/TESTNUM.wild}{$value}{NO}} +a..b: ${lookup{a..b}nwildlsearch{DIR/aux-var/TESTNUM.wild}{$value}{NO}} +a9b: ${lookup{a9b}nwildlsearch{DIR/aux-var/TESTNUM.wild}{$value}{NO}} +a99b: ${lookup{a99b}nwildlsearch{DIR/aux-var/TESTNUM.wild}{$value}{NO}} # But these should succeed -a\\:b: ${lookup{a\\:b}nwildlsearch{DIR/aux-var/0002.wild}} -a\\:Xb: ${lookup{a\\:Xb}nwildlsearch{DIR/aux-var/0002.wild}} +a\\:b: ${lookup{a\\:b}nwildlsearch{DIR/aux-var/TESTNUM.wild}} +a\\:Xb: ${lookup{a\\:Xb}nwildlsearch{DIR/aux-var/TESTNUM.wild}} # Some tests of case-(in)dependence -.MiXeD-CD: ${lookup{MiXeD-CD}nwildlsearch{DIR/aux-var/0002.wild}{$value}{NOT FOUND}} -.MixeD-CD: ${lookup{MixeD-CD}nwildlsearch{DIR/aux-var/0002.wild}{$value}{NOT FOUND}} -.MiXeD-Ncd: ${lookup{MiXeD-Ncd}nwildlsearch{DIR/aux-var/0002.wild}{$value}{NOT FOUND}} -.MixeD-Ncd: ${lookup{MixeD-Ncd}nwildlsearch{DIR/aux-var/0002.wild}{$value}{NOT FOUND}} +.MiXeD-CD: ${lookup{MiXeD-CD}nwildlsearch{DIR/aux-var/TESTNUM.wild}{$value}{NOT FOUND}} +.MixeD-CD: ${lookup{MixeD-CD}nwildlsearch{DIR/aux-var/TESTNUM.wild}{$value}{NOT FOUND}} +.MiXeD-Ncd: ${lookup{MiXeD-Ncd}nwildlsearch{DIR/aux-var/TESTNUM.wild}{$value}{NOT FOUND}} +.MixeD-Ncd: ${lookup{MixeD-Ncd}nwildlsearch{DIR/aux-var/TESTNUM.wild}{$value}{NOT FOUND}} # IP address (CIDR) lookups -1.2.3.4: ${lookup{1.2.3.4}iplsearch{DIR/aux-fixed/0002.iplsearch}} -1.2.3.5: ${lookup{1.2.3.5}iplsearch{DIR/aux-fixed/0002.iplsearch}} -1.2.3.5: ${lookup{1.2.3.5}iplsearch*{DIR/aux-fixed/0002.iplsearch}} -abcd::cdab: ${lookup{abcd::cdab}iplsearch{DIR/aux-fixed/0002.iplsearch}} -192.168.1.2: ${lookup{192.168.1.2}iplsearch{DIR/aux-fixed/0002.iplsearch}} -192.168.5.6: ${lookup{192.168.5.6}iplsearch{DIR/aux-fixed/0002.iplsearch}} -abcd:abcd:: ${lookup{abcd:abcd::}iplsearch{DIR/aux-fixed/0002.iplsearch}} -abcd:abcd:1:: ${lookup{abcd:abcd:1::}iplsearch{DIR/aux-fixed/0002.iplsearch}} -abcd:abcd::3 ${lookup{abcd:abcd::3}iplsearch{DIR/aux-fixed/0002.iplsearch}} -rhubarb ${lookup{rhubarb}iplsearch{DIR/aux-fixed/0002.iplsearch}} +1.2.3.4: ${lookup{1.2.3.4}iplsearch{DIR/aux-fixed/TESTNUM.iplsearch}} +1.2.3.5: ${lookup{1.2.3.5}iplsearch{DIR/aux-fixed/TESTNUM.iplsearch}} +1.2.3.5: ${lookup{1.2.3.5}iplsearch*{DIR/aux-fixed/TESTNUM.iplsearch}} +abcd::cdab: ${lookup{abcd::cdab}iplsearch{DIR/aux-fixed/TESTNUM.iplsearch}} +192.168.1.2: ${lookup{192.168.1.2}iplsearch{DIR/aux-fixed/TESTNUM.iplsearch}} +192.168.5.6: ${lookup{192.168.5.6}iplsearch{DIR/aux-fixed/TESTNUM.iplsearch}} +abcd:abcd:: ${lookup{abcd:abcd::}iplsearch{DIR/aux-fixed/TESTNUM.iplsearch}} +abcd:abcd:1:: ${lookup{abcd:abcd:1::}iplsearch{DIR/aux-fixed/TESTNUM.iplsearch}} +abcd:abcd::3 ${lookup{abcd:abcd::3}iplsearch{DIR/aux-fixed/TESTNUM.iplsearch}} +rhubarb ${lookup{rhubarb}iplsearch{DIR/aux-fixed/TESTNUM.iplsearch}} # Nested Lookups - style 1 -${lookup{${lookup{key1}lsearch{DIR/aux-fixed/0002.rec}{$value}{key1f}}}lsearch{DIR/aux-fixed/0002.rec}{$value}fail} -${lookup{${lookup{key3}lsearch{DIR/aux-fixed/0002.rec}{$value}{key1f}}}lsearch{DIR/aux-fixed/0002.rec}{$value}fail} +${lookup{${lookup{key1}lsearch{DIR/aux-fixed/TESTNUM.rec}{$value}{key1f}}}lsearch{DIR/aux-fixed/TESTNUM.rec}{$value}fail} +${lookup{${lookup{key3}lsearch{DIR/aux-fixed/TESTNUM.rec}{$value}{key1f}}}lsearch{DIR/aux-fixed/TESTNUM.rec}{$value}fail} # Nested Lookups - style 2 -${lookup{key1}lsearch{DIR/aux-fixed/0002.rec}{${lookup{$value}lsearch{DIR/aux-fixed/0002.rec}{$value}{failed for $value}}}{failed for key1}} -${lookup{key3}lsearch{DIR/aux-fixed/0002.rec}{${lookup{$value}lsearch{DIR/aux-fixed/0002.rec}{$value}{failed for $value}}}{failed for key1}} +${lookup{key1}lsearch{DIR/aux-fixed/TESTNUM.rec}{${lookup{$value}lsearch{DIR/aux-fixed/TESTNUM.rec}{$value}{failed for $value}}}{failed for key1}} +${lookup{key3}lsearch{DIR/aux-fixed/TESTNUM.rec}{${lookup{$value}lsearch{DIR/aux-fixed/TESTNUM.rec}{$value}{failed for $value}}}{failed for key1}} # Other nesting tests -${lookup{one}lsearch{DIR/aux-fixed/0002.alias1}{$value${lookup{one}lsearch{DIR/aux-fixed/0002.alias2}{,$value}}}{${lookup{one}lsearch{DIR/aux-fixed/0002.alias2}{$value}fail}}} -${lookup{two}lsearch{DIR/aux-fixed/0002.alias1}{$value${lookup{two}lsearch{DIR/aux-fixed/0002.alias2}{,$value}}}{${lookup{two}lsearch{DIR/aux-fixed/0002.alias2}{$value}fail}}} -${lookup{both}lsearch{DIR/aux-fixed/0002.alias1}{$value${lookup{both}lsearch{DIR/aux-fixed/0002.alias2}{,$value}}}{${lookup{both}lsearch{DIR/aux-fixed/0002.alias2}{$value}fail}}} -${lookup{neither}lsearch{DIR/aux-fixed/0002.alias1}{$value${lookup{neither}lsearch{DIR/aux-fixed/0002.alias2}{,$value}}}{${lookup{neither}lsearch{DIR/aux-fixed/0002.alias2}{$value}fail}}} +${lookup{one}lsearch{DIR/aux-fixed/TESTNUM.alias1}{$value${lookup{one}lsearch{DIR/aux-fixed/TESTNUM.alias2}{,$value}}}{${lookup{one}lsearch{DIR/aux-fixed/TESTNUM.alias2}{$value}fail}}} +${lookup{two}lsearch{DIR/aux-fixed/TESTNUM.alias1}{$value${lookup{two}lsearch{DIR/aux-fixed/TESTNUM.alias2}{,$value}}}{${lookup{two}lsearch{DIR/aux-fixed/TESTNUM.alias2}{$value}fail}}} +${lookup{both}lsearch{DIR/aux-fixed/TESTNUM.alias1}{$value${lookup{both}lsearch{DIR/aux-fixed/TESTNUM.alias2}{,$value}}}{${lookup{both}lsearch{DIR/aux-fixed/TESTNUM.alias2}{$value}fail}}} +${lookup{neither}lsearch{DIR/aux-fixed/TESTNUM.alias1}{$value${lookup{neither}lsearch{DIR/aux-fixed/TESTNUM.alias2}{,$value}}}{${lookup{neither}lsearch{DIR/aux-fixed/TESTNUM.alias2}{$value}fail}}} # Lookup quotes for standardly expected lookups @@ -798,26 +799,26 @@ toobig ${from_utf8:aĀd} # File insertion ${readfile} -${readfile{DIR/aux-fixed/0002.readfile}} -${readfile{DIR/aux-fixed/0002.readfile}{}} -${readfile{DIR/aux-fixed/0002.readfile}{:}} -${readfile{DIR/aux-fixed/0002.readfile}{ - }} +${readfile{DIR/aux-fixed/TESTNUM.readfile}} +${readfile{DIR/aux-fixed/TESTNUM.readfile}{}} +${readfile{DIR/aux-fixed/TESTNUM.readfile}{:}} +${readfile{DIR/aux-fixed/TESTNUM.readfile}{ - }} ${readfile{/non/exist/file}} ${if exists{/non/exist/file}{${readfile{/non/exist/file}}}{non-exist}} ->${readfile{DIR/aux-fixed/0002.readfile}{!}}\ +>${readfile{DIR/aux-fixed/TESTNUM.readfile}{!}}\ < # Calling a command -${run{DIR/aux-fixed/0002.runfile 0}} +${run{DIR/aux-fixed/TESTNUM.runfile 0}} rc=$runrc -${run{DIR/aux-fixed/0002.runfile 0}{1}{2}} +${run{DIR/aux-fixed/TESTNUM.runfile 0}{1}{2}} rc=$runrc -${run{DIR/aux-fixed/0002.runfile 0}{$value}{2}} +${run{DIR/aux-fixed/TESTNUM.runfile 0}{$value}{2}} rc=$runrc -${run{DIR/aux-fixed/0002.runfile 1}{$value}{2}} +${run{DIR/aux-fixed/TESTNUM.runfile 1}{$value}{2}} rc=$runrc -${run{DIR/aux-fixed/0002.runfile 1}{$value}{$value}} +${run{DIR/aux-fixed/TESTNUM.runfile 1}{$value}{$value}} rc=$runrc ${run{DIR/test-nonexist}{Y}{N}} rc=$runrc @@ -825,9 +826,9 @@ rc=$runrc rc=$runrc ${if eq{1}{2}{${run{/non/exist}}}{1!=2}} rc=$runrc -${run,preexpand {DIR/aux-fixed/0002.runfile 0}} +${run,preexpand {DIR/aux-fixed/TESTNUM.runfile 0}} rc=$runrc -${run{DIR/aux-fixed/0002.runfile ${quote:1}}{$value}{2}} +${run{DIR/aux-fixed/TESTNUM.runfile ${quote:1}}{$value}{2}} rc=$runrc # PRVS @@ -1138,10 +1139,11 @@ Subject: =?iso-8859-8?Q?_here_we_go=3A_a_string_that_is_going_to_be_encoded=3A_i . quit **** -# Certain kind of error +# Bad IP addresses exim -d -be match_ip: 15 ${if match_ip{1.2.3.4}{1.2.3}} match_ip: 16 ${if match_ip{1.2.3.4}{1.2.3.4/abc}} +match_ip: 17 ${if match_ip{::1}{<; aaaa:bbbb}} **** # Operation of inlist and negated inlist exim -be diff --git a/test/scripts/0000-Basic/0475 b/test/scripts/0000-Basic/0475 index 5008c8768..05f3a70e4 100644 --- a/test/scripts/0000-Basic/0475 +++ b/test/scripts/0000-Basic/0475 @@ -4,5 +4,7 @@ helo test mail from:<> rcpt to: rcpt to: +rcpt to: +rcpt to: quit **** diff --git a/test/stderr/0002 b/test/stderr/0002 index a74e98c11..087b58f60 100644 --- a/test/stderr/0002 +++ b/test/stderr/0002 @@ -746,5 +746,8 @@ sender address = CALLER@myhost.test.ex 1.2.3.4 in "1.2.3.4/abc"? list element: 1.2.3.4/abc 1.2.3.4 in "1.2.3.4/abc"? no (malformed IPv4 address or address mask: 1.2.3.4) - search_tidyup called + ::1 in "<; aaaa:bbbb"? + ╎list element: aaaa:bbbb + ╎::1 in "<; aaaa:bbbb"? no (malformed IPv6 address or address mask: aaaa:bbbb) + search_tidyup called >>>>>>>>>>>>>>>> Exim pid=p1240 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>> diff --git a/test/stderr/0475 b/test/stderr/0475 index 4626506f5..f080bfc0e 100644 --- a/test/stderr/0475 +++ b/test/stderr/0475 @@ -11,7 +11,7 @@ >>> list element: @[] >>> test in helo_lookup_domains? no (end of list) >>> using ACL "a1" ->>> processing "deny" (TESTSUITE/test-config 16) +>>> processing "deny" (TESTSUITE/test-config 17) >>> check hosts = 1.2.3.4 : <; 1.2.3.4::5.6.7.8 >>> host in "1.2.3.4 : <; 1.2.3.4::5.6.7.8"? >>> list element: 1.2.3.4 @@ -21,11 +21,31 @@ LOG: unknown lookup type "<" in host list item "<; 1.2.3.4:5.6.7.8" >>> deny: condition test deferred in ACL "a1" LOG: H=(test) [V4NET.0.0.0] F=<> temporarily rejected RCPT : unknown lookup type "<" >>> using ACL "a2" ->>> processing "deny" (TESTSUITE/test-config 19) +>>> processing "deny" (TESTSUITE/test-config 20) >>> check hosts = 1.2.3/24 >>> host in "1.2.3/24"? >>> list element: 1.2.3/24 >>> host in "1.2.3/24"? no (malformed IPv4 address or address mask: 1.2.3) +LOG: list matching forced to fail: malformed IPv4 address or address mask: 1.2.3 >>> deny: condition test failed in ACL "a2" >>> end of ACL "a2": implicit DENY LOG: H=(test) [V4NET.0.0.0] F=<> rejected RCPT +>>> using ACL "a3" +>>> processing "deny" (TESTSUITE/test-config 23) +>>> check hosts = <; fe80::1 +>>> host in "<; fe80::1"? +>>> list element: fe80::1 +>>> host in "<; fe80::1"? no (end of list) +>>> deny: condition test failed in ACL "a3" +>>> end of ACL "a3": implicit DENY +LOG: H=(test) [V4NET.0.0.0] F=<> rejected RCPT +>>> using ACL "a4" +>>> processing "deny" (TESTSUITE/test-config 26) +>>> check hosts = <; fe80:1 +>>> host in "<; fe80:1"? +>>> list element: fe80:1 +>>> host in "<; fe80:1"? no (malformed IPv6 address or address mask: fe80:1) +LOG: list matching forced to fail: malformed IPv6 address or address mask: fe80:1 +>>> deny: condition test failed in ACL "a4" +>>> end of ACL "a4": implicit DENY +LOG: H=(test) [V4NET.0.0.0] F=<> rejected RCPT diff --git a/test/stdout/0002 b/test/stdout/0002 index d5bb0605c..a79a5c733 100644 --- a/test/stdout/0002 +++ b/test/stdout/0002 @@ -466,6 +466,7 @@ newline tab\134backslash ~tilde\177DEL\200\201. > isip: y fe80::a00:20ff:fe86:a061 > isip4: n fe80::a00:20ff:fe86:a061 > isip6: y fe80::a00:20ff:fe86:a061 +> isip6: n fe80:a00:20ff:fe86:a061 > isip: y fe80::1.2.3.4 > isip: n rhubarb > isip4: n rhubarb @@ -1091,6 +1092,7 @@ xyz 221 myhost.test.ex closing connection > match_ip: 15 > match_ip: 16 +> match_ip: 17 > > in list > in list diff --git a/test/stdout/0475 b/test/stdout/0475 index 819cea3bc..d1f718997 100644 --- a/test/stdout/0475 +++ b/test/stdout/0475 @@ -8,4 +8,6 @@ 250 OK 451 Temporary local problem - please try later 550 Administrative prohibition +550 Administrative prohibition +550 Administrative prohibition 221 the.local.host.name closing connection