X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/f3ebb786e451da973560f1c9d8cdb151d25108b5..8d6cb5fdac4b2bab0922fe431e12d8f7cc02d723:/src/src/header.c diff --git a/src/src/header.c b/src/src/header.c index a6c44fac8..9bd376633 100644 --- a/src/src/header.c +++ b/src/src/header.c @@ -3,6 +3,7 @@ *************************************************/ /* Copyright (c) University of Cambridge 1995 - 2016 */ +/* Copyright (c) The Exim Maintainers 2020 - 2021 */ /* See the file NOTICE for conditions of use and distribution. */ @@ -96,12 +97,15 @@ header_add_backend(BOOL after, uschar *name, BOOL topnot, int type, header_line *h, *new = NULL; header_line **hptr; -uschar *p, *q; -uschar * buf = store_get(HEADER_ADD_BUFFER_SIZE, FALSE); -gstring gs = { .size = HEADER_ADD_BUFFER_SIZE, .ptr = 0, .s = buf }; +uschar * p, * q, * buf; +gstring gs; if (!header_last) return NULL; +gs.s = buf = store_get(HEADER_ADD_BUFFER_SIZE, FALSE); +gs.size = HEADER_ADD_BUFFER_SIZE; +gs.ptr = 0; + if (!string_vformat(&gs, SVFMT_REBUFFER, format, ap)) log_write(0, LOG_MAIN|LOG_PANIC_DIE, "string too long in header_add: " "%.100s ...", string_from_gstring(&gs)); @@ -321,9 +325,8 @@ while (bot < top) if (c == 0) { - uschar *s = text + mid->len; - while (isspace(*s)) s++; - if (*s == ':') + uschar * s = text + mid->len; + if (Uskip_whitespace(&s) == ':') return (!is_resent || mid->allow_resent)? mid->htype : htype_other; c = 1; } @@ -368,7 +371,7 @@ static BOOL one_pattern_match(uschar *name, int slen, BOOL has_addresses, uschar *pattern) { BOOL yield = FALSE; -const pcre *re = NULL; +const pcre2_code *re = NULL; /* If the pattern is a regex, compile it. Bomb out if compiling fails; these patterns are all constructed internally and should be valid. */ @@ -412,15 +415,13 @@ for (header_line * h = header_list; !yield && h; h = h->next) /* If there is some kind of syntax error, just give up on this header line. */ - if (next == NULL) break; + if (!next) break; /* Otherwise, test for the pattern; a non-regex must be an exact match */ - yield = (re == NULL)? - (strcmpic(next, pattern) == 0) - : - (pcre_exec(re, NULL, CS next, Ustrlen(next), 0, PCRE_EOPT, NULL, 0) - >= 0); + yield = re + ? regex_match(re, next, -1, NULL) + : (strcmpic(next, pattern) == 0); } } @@ -429,10 +430,9 @@ for (header_line * h = header_list; !yield && h; h = h->next) else { - yield = (re == NULL)? - (strstric(h->text, pattern, FALSE) != NULL) - : - (pcre_exec(re, NULL, CS h->text, h->slen, 0, PCRE_EOPT, NULL, 0) >= 0); + yield = re + ? regex_match(re, h->text, h->slen, NULL) + : (strstric(h->text, pattern, FALSE) != NULL); } }