From: Christopher Faulet Date: Fri, 19 Feb 2021 09:56:41 +0000 (+0100) Subject: BUG/MEDIUM: spoe: Resolve the sink if a SPOE logs in a ring buffer X-Git-Tag: v2.4-dev9~14 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1d7d0f86b8a7f0d74b47e2afe08f87d9b963d9fb;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: spoe: Resolve the sink if a SPOE logs in a ring buffer If a SPOE filter is configured to send its logs to a ring buffer, the corresponding sink must be resolved during the configuration post parsing. Otherwise, the sink is undefined when a log message is emitted, crashing HAProxy. This patch must be backported as far as 2.2. --- diff --git a/src/flt_spoe.c b/src/flt_spoe.c index bfd6f4fbfb..b9471d9170 100644 --- a/src/flt_spoe.c +++ b/src/flt_spoe.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -3021,6 +3022,7 @@ spoe_check(struct proxy *px, struct flt_conf *fconf) struct flt_conf *f; struct spoe_config *conf = fconf->conf; struct proxy *target; + struct logsrv *logsrv; int i; /* Check all SPOE filters for proxy to be sure all SPOE agent names @@ -3082,6 +3084,21 @@ spoe_check(struct proxy *px, struct flt_conf *fconf) HA_SPIN_INIT(&conf->agent->rt[i].lock); } + list_for_each_entry(logsrv, &conf->agent_fe.logsrvs, list) { + if (logsrv->type == LOG_TARGET_BUFFER) { + struct sink *sink = sink_find(logsrv->ring_name); + + if (!sink || sink->type != SINK_TYPE_BUFFER) { + ha_alert("Proxy %s : log server used by SPOE agent '%s' declared" + " at %s:%d uses unkown ring named '%s'.\n", + px->id, conf->agent->id, conf->agent->conf.file, + conf->agent->conf.line, logsrv->ring_name); + return 1; + } + logsrv->sink = sink; + } + } + free(conf->agent->b.name); conf->agent->b.name = NULL; conf->agent->b.be = target;