Lookups: fix $local_part_data for a match on a filename list element. Bug 2691
authorJeremy Harris <jgh146exb@wizmail.org>
Fri, 29 Jan 2021 16:34:27 +0000 (16:34 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Fri, 29 Jan 2021 18:26:57 +0000 (18:26 +0000)
doc/doc-txt/ChangeLog
src/src/match.c
test/aux-fixed/0134.listL [new file with mode: 0644]
test/confs/0134
test/log/0134
test/mail/0134.directfile [new file with mode: 0644]
test/scripts/0000-Basic/0134

index b209912802ba4210616a85308e0fa83ce3f0738d..e1a2fa3357e58c28a58736ed7ee7550921dfca29 100644 (file)
@@ -184,6 +184,10 @@ JH/38 When logging an AUTH failure, as server, do not include sensitive
       information. Previously, the credentials would be included if given
       as part of the AUTH command line and an ACL denied authentidcation.
 
       information. Previously, the credentials would be included if given
       as part of the AUTH command line and an ACL denied authentidcation.
 
+JH/39 Bug 2691: fix $local_part_data.  When the matching list element
+      referred to a file, bad data was returned.  This likely also affected
+      $domain_part_data.
+
 
 
 Exim version 4.94
 
 
 Exim version 4.94
index 597b633fee8d932df4165aeaee7ccc14f06b9db2..73cdab01278ddad00b06cb2048cf6ec395598f14 100644 (file)
@@ -809,19 +809,19 @@ while ((sss = string_nextinlist(&list, &sep, NULL, 0)))
         sss = ss + 1;
         }
 
         sss = ss + 1;
         }
 
-      ss = filebuffer + Ustrlen(filebuffer);             /* trailing space */
+      ss = filebuffer + Ustrlen(filebuffer);           /* trailing space */
       while (ss > filebuffer && isspace(ss[-1])) ss--;
       *ss = 0;
 
       ss = filebuffer;
       while (ss > filebuffer && isspace(ss[-1])) ss--;
       *ss = 0;
 
       ss = filebuffer;
-      while (isspace(*ss)) ss++;                         /* leading space */
+      while (isspace(*ss)) ss++;                       /* leading space */
 
 
-      if (*ss == 0) continue;                            /* ignore empty */
+      if (!*ss) continue;                              /* ignore empty */
 
 
-      file_yield = yield;                                /* positive yield */
-      sss = ss;                                          /* for debugging */
+      file_yield = yield;                              /* positive yield */
+      sss = ss;                                                /* for debugging */
 
 
-      if (*ss == '!')                                    /* negation */
+      if (*ss == '!')                                  /* negation */
         {
         file_yield = (file_yield == OK)? FAIL : OK;
         while (isspace((*(++ss))));
         {
         file_yield = (file_yield == OK)? FAIL : OK;
         while (isspace((*(++ss))));
@@ -833,6 +833,11 @@ while ((sss = string_nextinlist(&list, &sep, NULL, 0)))
          (void)fclose(f);
          HDEBUG(D_lists) debug_printf("%s %s (matched \"%s\" in %s)\n", ot,
            yield == OK ? "yes" : "no", sss, filename);
          (void)fclose(f);
          HDEBUG(D_lists) debug_printf("%s %s (matched \"%s\" in %s)\n", ot,
            yield == OK ? "yes" : "no", sss, filename);
+
+         /* The "pattern" being matched came from the file; we use a stack-local.
+         Copy it to allocated memory now we know it matched. */
+
+         if (valueptr) *valueptr = string_copy(ss);
          return file_yield;
 
         case DEFER:
          return file_yield;
 
         case DEFER:
diff --git a/test/aux-fixed/0134.listL b/test/aux-fixed/0134.listL
new file mode 100644 (file)
index 0000000..c3be4e8
--- /dev/null
@@ -0,0 +1 @@
+direct_file_user
index 9530df65273942117c2e4ccd3550015717d39afc..3376f05f3d14663326325e94f6234e9f17af9252 100644 (file)
@@ -45,6 +45,14 @@ smartuser:
   retry_use_local_part
   transport = appendfile
 
   retry_use_local_part
   transport = appendfile
 
+smartuser_direct:
+  driver = accept
+  domains = test.ex
+  headers_add = "smartuser: dd=$domain_data lpd=$local_part_data"
+  local_parts = DIR/aux-fixed/TESTNUM.listL
+  retry_use_local_part
+  transport = directfile
+
 default2:
   driver = accept
   headers_add = router: defaulted
 default2:
   driver = accept
   headers_add = router: defaulted
@@ -71,6 +79,13 @@ appendfile:
          ${if eq {$local_part}{userx}{lc-userx}{\
          $local_part}}}}}}
 
          ${if eq {$local_part}{userx}{lc-userx}{\
          $local_part}}}}}}
 
+directfile:
+  driver = appendfile
+  user = CALLER
+  headers_add = "domain_data: $domain_data\n\
+                 local_part_data: $local_part_data"
+  file = DIR/test-mail/directfile
+
 pipe:
   driver = pipe
   command = /bin/sh -c "echo $local_part $domain >DIR/test-mail/$local_part"
 pipe:
   driver = pipe
   command = /bin/sh -c "echo $local_part $domain >DIR/test-mail/$local_part"
index 1d4707f3968fc512fbf9a9746bcf254c57e7978a..956558fa67cd8d419d0de0001d51a61ad1dd72c3 100644 (file)
@@ -23,3 +23,6 @@
 1999-03-02 09:44:33 10HmbE-0005vi-00 <= CALLER@test.ex U=CALLER P=local S=sss
 1999-03-02 09:44:33 10HmbE-0005vi-00 => PIPE <PIPE@PIPE.DOMAIN> R=topipe T=pipe
 1999-03-02 09:44:33 10HmbE-0005vi-00 Completed
 1999-03-02 09:44:33 10HmbE-0005vi-00 <= CALLER@test.ex U=CALLER P=local S=sss
 1999-03-02 09:44:33 10HmbE-0005vi-00 => PIPE <PIPE@PIPE.DOMAIN> R=topipe T=pipe
 1999-03-02 09:44:33 10HmbE-0005vi-00 Completed
+1999-03-02 09:44:33 10HmbF-0005vi-00 <= CALLER@test.ex U=CALLER P=local S=sss
+1999-03-02 09:44:33 10HmbF-0005vi-00 => direct_file_user <direct_file_user@test.ex> R=smartuser_direct T=directfile
+1999-03-02 09:44:33 10HmbF-0005vi-00 Completed
diff --git a/test/mail/0134.directfile b/test/mail/0134.directfile
new file mode 100644 (file)
index 0000000..aa9475d
--- /dev/null
@@ -0,0 +1,14 @@
+From CALLER@test.ex Tue Mar 02 09:44:33 1999
+Received: from CALLER by the.local.host.name with local (Exim x.yz)
+       (envelope-from <CALLER@test.ex>)
+       id 10HmbF-0005vi-00
+       for direct_file_user@test.ex; Tue, 2 Mar 1999 09:44:33 +0000
+Message-Id: <E10HmbF-0005vi-00@the.local.host.name>
+From: CALLER_NAME <CALLER@test.ex>
+Date: Tue, 2 Mar 1999 09:44:33 +0000
+smartuser: dd=test.ex lpd=direct_file_user
+domain_data: test.ex
+local_part_data: direct_file_user
+
+Test use of filename in local_part list
+
index 76c1f8206a84367253433ffa132002ac4754c647..15f3b05b2ac916dc3d2dc674ec845a2d6f966be9 100644 (file)
@@ -31,3 +31,7 @@ exim -odi PIPE@PIPE.DOMAIN
 Test to uppercased piped address.
 .
 ****
 Test to uppercased piped address.
 .
 ****
+exim -odi direct_file_user@test.ex
+Test use of filename in local_part list
+.
+****