X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/4191cb150300d310ab5fa22ce2cfb02b6f6051b0..d945e180cbe2b26392fb21f7ae4dd2ccc603a81b:/src/src/rewrite.c diff --git a/src/src/rewrite.c b/src/src/rewrite.c index 9420e79b9..70bd79e26 100644 --- a/src/src/rewrite.c +++ b/src/src/rewrite.c @@ -2,9 +2,10 @@ * Exim - an Internet mail transport agent * *************************************************/ +/* Copyright (c) The Exim Maintainers 2021 - 2023 */ /* Copyright (c) University of Cambridge 1995 - 2018 */ -/* Copyright (c) The Exim Maintainers 2021 */ /* See the file NOTICE for conditions of use and distribution. */ +/* SPDX-License-Identifier: GPL-2.0-or-later */ /* Functions concerned with rewriting headers */ @@ -118,9 +119,9 @@ for (rewrite_rule * rule = rewrite_rules; { int start, end, pdomain; int count = 0; - uschar *save_localpart; - const uschar *save_domain; - uschar *error, *new; + const uschar * save_localpart; + const uschar * save_domain; + uschar * error, * new; const uschar * newparsed; /* Come back here for a repeat after a successful rewrite. We do this @@ -136,7 +137,8 @@ for (rewrite_rule * rule = rewrite_rules; if (flag & rewrite_smtp) { - uschar *key = expand_string(rule->key); + BOOL textonly_re; + const uschar * key = expand_string_2(rule->key, &textonly_re); if (!key) { if (!f.expand_string_forcedfail) @@ -144,7 +146,8 @@ for (rewrite_rule * rule = rewrite_rules; "checking for SMTP rewriting: %s", rule->key, expand_string_message); continue; } - if (match_check_string(subject, key, 0, TRUE, FALSE, FALSE, NULL) != OK) + if (match_check_string(subject, key, 0, + textonly_re ? MCS_CACHEABLE | MCS_PARTIAL : MCS_PARTIAL, NULL) != OK) continue; new = expand_string(rule->replacement); } @@ -447,13 +450,13 @@ rewrite_one_header(header_line *h, int flag, rewrite_rule *rewrite_rules, int existflags, BOOL replace) { int lastnewline = 0; -header_line *newh = NULL; +header_line * newh = NULL; rmark function_reset_point = store_mark(); -uschar *s = Ustrchr(h->text, ':') + 1; +uschar * s = Ustrchr(h->text, ':') + 1; while (isspace(*s)) s++; -DEBUG(D_rewrite) +DEBUG(D_rewrite) /* The header text includes the trailing newline */ debug_printf_indent("rewrite_one_header: type=%c:\n %s", h->type, h->text); f.parse_allow_group = TRUE; /* Allow group syntax */ @@ -467,24 +470,31 @@ We want to avoid keeping store for any intermediate versions. */ while (*s) { - uschar *sprev; - uschar *ss = parse_find_address_end(s, FALSE); - uschar *recipient, *new; + uschar * sprev = s; + uschar * ss = parse_find_address_end(s, FALSE), * ss1 = ss; + uschar * recipient, * new; rmark loop_reset_point = store_mark(); - uschar *errmess = NULL; + uschar * errmess = NULL; BOOL changed = FALSE; - int terminator = *ss; + uschar terminator = *ss; int start, end, domain; + /* If we hit the end of the header, trim trailing newline and whitespace */ + + if (!terminator) + { + while (ss1 > s && isspace(ss1[-1])) ss1--; + terminator = *ss1; + } + /* Temporarily terminate the string at this point, and extract the operative address within. Then put back the terminator and prepare for the next address, saving the start of the old one. */ - *ss = 0; + *ss1 = '\0'; recipient = parse_extract_address(s, &errmess, &start, &end, &domain, FALSE); - *ss = terminator; - sprev = s; - s = ss + (terminator ? 1 : 0); + *ss1 = terminator; + s = ss + (*ss ? 1 : 0); while (isspace(*s)) s++; /* There isn't much we can do for syntactic disasters at this stage. @@ -495,15 +505,14 @@ while (*s) if (!recipient) { - /* Handle unparesable addresses in the header. Slightly ugly because a + /* Log unparesable addresses in the header. Slightly ugly because a null output from the extract can also result from a header without an - address, "To: undisclosed recpients:;" being the classic case. */ + address, "To: undisclosed recpients:;" being the classic case. Ignore + this one and carry on. */ + + if (Ustrcmp(errmess, "empty address") != 0) + log_write(0, LOG_MAIN, "qualify/rewrite: %s", errmess); - if ((rewrite_rules || routed_old) && Ustrcmp(errmess, "empty address") != 0) - { - log_write(0, LOG_MAIN, "rewrite: %s", errmess); - exim_exit(EXIT_FAILURE); - } loop_reset_point = store_reset(loop_reset_point); continue; } @@ -585,7 +594,8 @@ while (*s) point, because we may have a rewritten line from a previous time round the loop. */ - if (!changed) loop_reset_point = store_reset(loop_reset_point); + if (!changed) + loop_reset_point = store_reset(loop_reset_point); /* If the address has changed, create a new header containing the rewritten address. We do not need to set the chain pointers at this