[exim-cvs] wip - see failed-summary.log.list_match_value. Pr…

Top Page
Delete this message
Reply to this message
Author: Exim Git Commits Mailing List
Date:  
To: exim-cvs
Subject: [exim-cvs] wip - see failed-summary.log.list_match_value. Pretty much ok.
Gitweb: https://git.exim.org/exim.git/commitdiff/fa0798c026131e183625e88dab4fb33b552cbb7e
Commit:     fa0798c026131e183625e88dab4fb33b552cbb7e
Parent:     57aa14b216432be381b6295c312065b2fd034f86
Author:     Jeremy Harris <jgh146exb@???>
AuthorDate: Tue May 5 14:22:45 2020 +0100
Committer:  Jeremy Harris <jgh146exb@???>
CommitDate: Tue May 5 23:58:59 2020 +0100


    wip - see failed-summary.log.list_match_value.  Pretty much ok.


    tofo: testcases, docs
---
 src/src/match.c | 90 ++++++++++++++++++++++++++++++---------------------------
 1 file changed, 48 insertions(+), 42 deletions(-)


diff --git a/src/src/match.c b/src/src/match.c
index e07d0bd..d4c3008 100644
--- a/src/src/match.c
+++ b/src/src/match.c
@@ -130,35 +130,35 @@ required. */

 if (pattern[0] == '^')
   {
-  const pcre *re = regex_must_compile(pattern, cb->caseless, FALSE);
-  return ((expand_setup < 0)?
-           pcre_exec(re, NULL, CCS s, Ustrlen(s), 0, PCRE_EOPT, NULL, 0) >= 0
-           :
-           regex_match_and_setup(re, s, 0, expand_setup)
-         )?
-         OK : FAIL;
+  const pcre * re = regex_must_compile(pattern, cb->caseless, FALSE);
+  return (expand_setup < 0
+      ? pcre_exec(re, NULL, CCS s, Ustrlen(s), 0, PCRE_EOPT, NULL, 0) >= 0
+          : regex_match_and_setup(re, s, 0, expand_setup)
+         )
+     ? OK : FAIL;
   }


/* Tail match */

 if (pattern[0] == '*')
   {
-  BOOL yield;
   int slen = Ustrlen(s);
   int patlen;    /* Sun compiler doesn't like non-constant initializer */


   patlen = Ustrlen(++pattern);
   if (patlen > slen) return FAIL;
-  yield = cb->caseless?
-    (strncmpic(s + slen - patlen, pattern, patlen) == 0) :
-    (Ustrncmp(s + slen - patlen, pattern, patlen) == 0);
-  if (yield && expand_setup >= 0)
+  if (cb->caseless
+      ? strncmpic(s + slen - patlen, pattern, patlen) != 0
+      : Ustrncmp(s + slen - patlen, pattern, patlen) != 0)
+    return FAIL;
+  if (expand_setup >= 0)
     {
     expand_nstring[++expand_setup] = s;
     expand_nlength[expand_setup] = slen - patlen;
     expand_nmax = expand_setup;
     }
-  return yield? OK : FAIL;
+  if (valueptr) *valueptr = pattern;
+  return OK;
   }


 /* Match a special item starting with @ if so enabled. On its own, "@" matches
@@ -181,7 +181,10 @@ if (cb->at_is_special && pattern[0] == '@')
     for (ip_address_item * ip = host_find_interfaces(); ip; ip = ip->next)
       if (Ustrncmp(ip->address, s+1, slen - 2) == 0
             && ip->address[slen - 2] == 0)
+    {
+    if (valueptr) *valueptr = pattern;
         return OK;
+    }
     return FAIL;
     }


@@ -209,7 +212,7 @@ if (cb->at_is_special && pattern[0] == '@')
     else goto NOT_AT_SPECIAL;


     if (strncmpic(ss, US"/ignore=", 8) == 0) ignore_target_hosts = ss + 8;
-      else if (*ss != 0) goto NOT_AT_SPECIAL;
+    else if (*ss) goto NOT_AT_SPECIAL;


     h.next = NULL;
     h.name = s;
@@ -231,9 +234,10 @@ if (cb->at_is_special && pattern[0] == '@')
       return DEFER;
       }


-    if (rc == HOST_FOUND_LOCAL && !secy) return OK;
-    if (prim) return FAIL;
-    return removed? OK : FAIL;
+    if (rc != HOST_FOUND_LOCAL || secy)
+      if (prim || !removed) return FAIL;
+    if (valueptr) *valueptr = pattern;
+    return OK;


     /*** The above line used to be the following line, but this is incorrect,
     because host_find_bydns() may return HOST_NOT_FOUND if it removed some MX
@@ -253,10 +257,23 @@ NOT_AT_SPECIAL:


 if ((semicolon = Ustrchr(pattern, ';')) == NULL)
   {
-  BOOL yield = cb->caseless?
-    (strcmpic(s, pattern) == 0) : (Ustrcmp(s, pattern) == 0);
-  if (yield && expand_setup >= 0) expand_nmax = expand_setup;
-  return yield? OK : FAIL;
+  if (cb->caseless ? strcmpic(s, pattern) != 0 : Ustrcmp(s, pattern) != 0)
+    return FAIL;
+  if (expand_setup >= 0) expand_nmax = expand_setup;
+  if (valueptr) *valueptr = pattern;
+  return OK;
+
+/*
+XXX  looks like $0 may be usable
+XXX  could add setting of *valueptr to all the OK returns; seems doable here, the Q
+     is: what effect would it have at config-file level.  domain_data & local_part_data
+     would get filled in... might anyone be checking it for emptiness?  I think the docs
+     do not say "will be empty otherwise", so that seems ok.
+XXX WORRY: we get new caching of named-list match results.  Is that cache checked
+     for the key being matched?
+XXX  could also add $0 fill-in with the matching text for pattern?  RE already has it,
+     tailmatch already has it, @[] => dotted.quad.etc, @mx => h->address ?
+*/
   }


 /* Otherwise we have a lookup item. The lookup type, including partial, etc. is
@@ -1168,16 +1185,10 @@ if (pdomain != NULL)
     {
     int cllen = pllen - 1;
     if (sllen < cllen) return FAIL;
-    if (cb->caseless)
-      {
-      if (strncmpic(subject+sllen-cllen, pattern + 1, cllen) != 0)
+    if (cb->caseless
+        ? strncmpic(subject+sllen-cllen, pattern + 1, cllen) != 0
+        : Ustrncmp(subject+sllen-cllen, pattern + 1, cllen) != 0)
         return FAIL;
-      }
-    else
-      {
-      if (Ustrncmp(subject+sllen-cllen, pattern + 1, cllen) != 0)
-        return FAIL;
-      }
     if (cb->expand_setup > 0)
       {
       expand_nstring[cb->expand_setup] = subject;
@@ -1188,14 +1199,9 @@ if (pdomain != NULL)
   else
     {
     if (sllen != pllen) return FAIL;
-    if (cb->caseless)
-      {
-      if (strncmpic(subject, pattern, sllen) != 0) return FAIL;
-      }
-    else
-      {
-      if (Ustrncmp(subject, pattern, sllen) != 0) return FAIL;
-      }
+    if (cb->caseless
+        ? strncmpic(subject, pattern, sllen) != 0
+    : Ustrncmp(subject, pattern, sllen) != 0) return FAIL;
     }
   }


@@ -1204,7 +1210,7 @@ the generalized function, which supports file lookups (which may defer). The
original code read as follows:

   return match_check_string(sdomain + 1,
-      (pdomain == NULL)? pattern : pdomain + 1,
+      pdomain ? pdomain + 1 : pattern,
       cb->expand_setup + expand_inc, TRUE, cb->caseless, TRUE, NULL);


This supported only literal domains and *.x.y patterns. In order to allow for
@@ -1212,14 +1218,14 @@ named domain lists (so that you can right, for example, "senders=+xxxx"), it
was changed to use the list scanning function. */

csb.origsubject = sdomain + 1;
-csb.subject = (cb->caseless)? string_copylc(sdomain+1) : string_copy(sdomain+1);
+csb.subject = cb->caseless ? string_copylc(sdomain+1) : string_copy(sdomain+1);
csb.expand_setup = cb->expand_setup + expand_inc;
csb.use_partial = TRUE;
csb.caseless = cb->caseless;
csb.at_is_special = TRUE;

-listptr = (pdomain == NULL)? pattern : pdomain + 1;
-if (valueptr != NULL) *valueptr = NULL;
+listptr = pdomain ? pdomain + 1 : pattern;
+if (valueptr) *valueptr = NULL;

 return match_check_list(
   &listptr,                  /* list of one item */