*************************************************/
/* Copyright (c) University of Cambridge 1995 - 2016 */
+/* Copyright (c) The Exim Maintainers 2020 */
/* See the file NOTICE for conditions of use and distribution. */
header_add_backend(BOOL after, uschar *name, BOOL topnot, int type,
const char *format, va_list ap)
{
-header_line *h, *new;
+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 */
if (!name)
- {
if (after)
{
- hptr = &(header_last->next);
+ hptr = &header_last->next;
h = NULL;
}
else
hptr = &header_list->next;
h = *hptr;
}
- }
else
{
for (;;)
{
if (!h->next || !header_testname(h, name, len, FALSE)) break;
- hptr = &(h->next);
+ hptr = &h->next;
h = h->next;
}
}
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 != 0; )
+for (p = q = gs.s; *p; p = q)
{
for (;;)
{
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;
new->next = h;
*hptr = new;
- hptr = &(new->next);
+ hptr = &new->next;
if (!h) header_last = new;
- p = q;
}
return new;
}
header_add_at_position(BOOL after, uschar *name, BOOL topnot, int type,
const char *format, ...)
{
-header_line * h;
va_list ap;
va_start(ap, format);
(void) header_add_backend(after, name, topnot, type, format, ap);
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;
}
/* 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);
}
}