From: Christopher Faulet Date: Wed, 20 Aug 2025 13:38:42 +0000 (+0200) Subject: BUG/MINOR: spoe: Properly detect and skip empty NOTIFY frames X-Git-Tag: v3.3-dev7~19 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=dc6e8dde231990d6f999c64117a301fc66a7256c;p=thirdparty%2Fhaproxy.git BUG/MINOR: spoe: Properly detect and skip empty NOTIFY frames Since the SPOE was refactored, the detection of empty NOTIFY frames is broken. So it is possible to send a NOTIFY frames to an agent with no message at all. The bug happens because the frame type is now added to the buffer before the messages encoding. So the buffer is never really empty. To fix the issue, the condition to detect empty frame was adapted. This patch must be backported as far as 3.1. --- diff --git a/src/flt_spoe.c b/src/flt_spoe.c index 8eb2681a0..371037129 100644 --- a/src/flt_spoe.c +++ b/src/flt_spoe.c @@ -647,13 +647,14 @@ static int spoe_encode_messages(struct stream *s, struct spoe_context *ctx, struct spoe_config *conf = FLT_CONF(ctx->filter); struct spoe_agent *agent = conf->agent; struct spoe_message *msg; - char *p, *end; + char *p, *start, *end; p = b_head(&ctx->buffer); end = p + agent->max_frame_size - SPOP_FRAME_HDR_SIZE; /* Set Frame type */ *p++ = SPOP_FRM_T_HAPROXY_NOTIFY; + start = p; if (type == SPOE_MSGS_BY_EVENT) { /* Loop on messages by event */ list_for_each_entry(msg, messages, by_evt) { @@ -673,7 +674,7 @@ static int spoe_encode_messages(struct stream *s, struct spoe_context *ctx, /* nothing has been encoded */ - if (p == b_head(&ctx->buffer)) + if (p == start) goto skip; b_set_data(&ctx->buffer, p - b_head(&ctx->buffer));