From: Christopher Faulet Date: Mon, 6 May 2019 07:53:10 +0000 (+0200) Subject: BUG/MEDIUM: spoe: Be sure the sample is found before setting its context X-Git-Tag: v2.0-dev3~79 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3b1d004d410129efcf365643d2583dcd2cb6ed0f;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: spoe: Be sure the sample is found before setting its context When a sample fetch is encoded, we use its context to set info about the fragmentation. But if the sample is not found, the function sample_process() returns NULL. So we me be sure the sample exists before setting its context. This patch must be backported to 1.9 and 1.8. --- diff --git a/include/proto/spoe.h b/include/proto/spoe.h index c840c887b7..b3f7b4f8bb 100644 --- a/include/proto/spoe.h +++ b/include/proto/spoe.h @@ -169,8 +169,8 @@ spoe_encode_data(struct sample *smp, char **buf, char *end) * reamining. When all the sample is encoded, the offset is reset to 0. * So the caller know it can try to encode the next sample. */ struct buffer *chk = &smp->data.u.str; - unsigned int *len = (smp->ctx.a[0] ? smp->ctx.a[0] : 0); - unsigned int *off = (smp->ctx.a[1] ? smp->ctx.a[1] : 0); + unsigned int *len = smp->ctx.a[0]; + unsigned int *off = smp->ctx.a[1]; if (!*off) { /* First evaluation of the sample : encode the diff --git a/src/flt_spoe.c b/src/flt_spoe.c index 75854b7ae3..82e2719941 100644 --- a/src/flt_spoe.c +++ b/src/flt_spoe.c @@ -2195,8 +2195,10 @@ spoe_encode_message(struct stream *s, struct spoe_context *ctx, /* Fetch the argument value */ smp = sample_process(s->be, s->sess, s, dir|SMP_OPT_FINAL, arg->expr, NULL); - smp->ctx.a[0] = &ctx->frag_ctx.curlen; - smp->ctx.a[1] = &ctx->frag_ctx.curoff; + if (smp) { + smp->ctx.a[0] = &ctx->frag_ctx.curlen; + smp->ctx.a[1] = &ctx->frag_ctx.curoff; + } ret = spoe_encode_data(smp, buf, end); if (ret == -1 || ctx->frag_ctx.curoff) goto too_big;