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.

[wt: for 1.8 and older, a backport was successfully tested here :
 https://www.mail-archive.com/haproxy@formilux.org/msg30694.html]
This commit is contained in:
Emeric Brun 2018-07-17 09:47:07 -04:00 committed by Willy Tarreau
parent e1b4ed4352
commit 271022150d
1 changed files with 18 additions and 3 deletions

View File

@ -185,11 +185,26 @@ static int sample_conv_map(const struct arg *arg_p, struct sample *smp, void *pr
if (pat->data) { if (pat->data) {
/* In the regm case, merge the sample with the input. */ /* In the regm case, merge the sample with the input. */
if ((long)private == PAT_MATCH_REGM) { if ((long)private == PAT_MATCH_REGM) {
struct buffer *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->data = smp->data.u.str.data;
if (tmptrash->data > (tmptrash->size-1))
tmptrash->data = tmptrash->size-1;
memcpy(tmptrash->area, smp->data.u.str.area, tmptrash->data);
tmptrash->area[tmptrash->data] = 0;
str = get_trash_chunk(); str = get_trash_chunk();
str->data = exp_replace(str->area, str->size, str->data = exp_replace(str->area, str->size,
smp->data.u.str.area, tmptrash->area,
pat->data->u.str.area, pat->data->u.str.area,
(regmatch_t *)smp->ctx.a[0]); (regmatch_t *)smp->ctx.a[0]);
if (str->data == -1) if (str->data == -1)
return 0; return 0;
smp->data.u.str = *str; smp->data.u.str = *str;