X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=src%2Fsrc%2Fheader.c;h=cf7a81296f74c2c05a3266cfea5f131567f5393c;hb=824ac9569a44ae411785f7ba2014d243e85b992d;hp=76ea10f132eee0aafa985dfb0767c8e7b952147d;hpb=dca6d121a4bdc3fd58cf1e72e9fe04278ae6fac0;p=exim.git diff --git a/src/src/header.c b/src/src/header.c index 76ea10f13..cf7a81296 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 */ /* See the file NOTICE for conditions of use and distribution. */ @@ -97,14 +98,17 @@ header_line *h, *new = NULL; header_line **hptr; uschar *p, *q; -uschar buffer[HEADER_ADD_BUFFER_SIZE]; -gstring gs = { .size = HEADER_ADD_BUFFER_SIZE, .ptr = 0, .s = buffer }; +uschar * buf = store_get(HEADER_ADD_BUFFER_SIZE, FALSE); +gstring gs = { .size = HEADER_ADD_BUFFER_SIZE, .ptr = 0, .s = buf }; if (!header_last) return NULL; -if (!string_vformat(&gs, FALSE, format, ap)) +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)); + +if (gs.s != buf) store_release_above(buf); +gstring_release_unused(&gs); string_from_gstring(&gs); /* Find where to insert this header */ @@ -166,7 +170,7 @@ else point, we have hptr pointing to the link field that will point to the new header, and h containing the following header, or NULL. */ -for (p = q = buffer; *p; p = q) +for (p = q = gs.s; *p; p = q) { for (;;) { @@ -175,7 +179,7 @@ for (p = q = buffer; *p; p = q) if (*(++q) != ' ' && *q != '\t') break; } - new = store_get(sizeof(header_line)); + new = store_get(sizeof(header_line), FALSE); new->text = string_copyn(p, q - p); new->slen = q - p; new->type = type; @@ -318,9 +322,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; } @@ -409,14 +412,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) + yield = !re + ? (strcmpic(next, pattern) == 0) + : (pcre_exec(re, NULL, CS next, Ustrlen(next), 0, PCRE_EOPT, NULL, 0) >= 0); } }