From 0c70e694cf1a703798c0778a3236079e1b25c91d Mon Sep 17 00:00:00 2001 From: Jeremy Harris Date: Fri, 29 Jan 2021 16:34:27 +0000 Subject: [PATCH 1/1] Lookups: fix $local_part_data for a match on a filename list element. Bug 2691 --- doc/doc-txt/ChangeLog | 4 ++++ src/src/match.c | 17 +++++++++++------ test/aux-fixed/0134.listL | 1 + test/confs/0134 | 15 +++++++++++++++ test/log/0134 | 3 +++ test/mail/0134.directfile | 14 ++++++++++++++ test/scripts/0000-Basic/0134 | 4 ++++ 7 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 test/aux-fixed/0134.listL create mode 100644 test/mail/0134.directfile diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog index b20991280..e1a2fa335 100644 --- a/doc/doc-txt/ChangeLog +++ b/doc/doc-txt/ChangeLog @@ -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. +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 diff --git a/src/src/match.c b/src/src/match.c index 597b633fe..73cdab012 100644 --- a/src/src/match.c +++ b/src/src/match.c @@ -809,19 +809,19 @@ while ((sss = string_nextinlist(&list, &sep, NULL, 0))) 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 (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)))); @@ -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); + + /* 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: diff --git a/test/aux-fixed/0134.listL b/test/aux-fixed/0134.listL new file mode 100644 index 000000000..c3be4e8e1 --- /dev/null +++ b/test/aux-fixed/0134.listL @@ -0,0 +1 @@ +direct_file_user diff --git a/test/confs/0134 b/test/confs/0134 index 9530df652..3376f05f3 100644 --- a/test/confs/0134 +++ b/test/confs/0134 @@ -45,6 +45,14 @@ smartuser: 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 @@ -71,6 +79,13 @@ appendfile: ${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" diff --git a/test/log/0134 b/test/log/0134 index 1d4707f39..956558fa6 100644 --- a/test/log/0134 +++ b/test/log/0134 @@ -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 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 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 index 000000000..aa9475d5f --- /dev/null +++ b/test/mail/0134.directfile @@ -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 ) + id 10HmbF-0005vi-00 + for direct_file_user@test.ex; Tue, 2 Mar 1999 09:44:33 +0000 +Message-Id: +From: CALLER_NAME +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 + diff --git a/test/scripts/0000-Basic/0134 b/test/scripts/0000-Basic/0134 index 76c1f8206..15f3b05b2 100644 --- a/test/scripts/0000-Basic/0134 +++ b/test/scripts/0000-Basic/0134 @@ -31,3 +31,7 @@ exim -odi PIPE@PIPE.DOMAIN Test to uppercased piped address. . **** +exim -odi direct_file_user@test.ex +Test use of filename in local_part list +. +**** -- 2.30.2