commit a1110e24e5be53ba5fe9ab82372c02a60da06cf9 Author: Emeric Brun Date: Tue Jul 17 09:47:07 2018 -0400 BUG/MINOR: map: fix map_regm with backref Due to a cascade of get_trash_chunk calls the sample is corrupted when we want to read it. The fix consist to use a temporary chunk to copy the sample value and use it. (cherry picked from commit 271022150d7961b9aa39dbfd88e0c6a4bc48c3ee) Signed-off-by: Willy Tarreau diff --git a/src/map.c b/src/map.c index a9a1e53c..da399088 100644 --- a/src/map.c +++ b/src/map.c @@ -184,10 +184,27 @@ static int sample_conv_map(const struct arg *arg_p, struct sample *smp, void *pr if (pat->data) { /* In the regm case, merge the sample with the input. */ if ((long)private == PAT_MATCH_REGM) { + struct chunk *tmptrash; + + /* Copy the content of the sample because it could + be scratched by incoming get_trash_chunk */ + tmptrash = alloc_trash_chunk(); + if (!tmptrash) + return 0; + + tmptrash->len = smp->data.u.str.len; + if (tmptrash->len > (tmptrash->size-1)) + tmptrash->len = tmptrash->size-1; + + memcpy(tmptrash->str, smp->data.u.str.str, tmptrash->len); + tmptrash->str[tmptrash->len] = 0; + str = get_trash_chunk(); - str->len = exp_replace(str->str, str->size, smp->data.u.str.str, + str->len = exp_replace(str->str, str->size, tmptrash->str, pat->data->u.str.str, (regmatch_t *)smp->ctx.a[0]); + + free_trash_chunk(tmptrash); if (str->len == -1) return 0; smp->data.u.str = *str;