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.
(cherry picked from commit 1d7d0f86b8a7f0d74b47e2afe08f87d9b963d9fb)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
diff --git a/src/flt_spoe.c b/src/flt_spoe.c
index 58a7e79..bc3671c 100644
--- a/src/flt_spoe.c
+++ b/src/flt_spoe.c
@@ -28,6 +28,7 @@
#include <haproxy/sample.h>
#include <haproxy/session.h>
#include <haproxy/signal.h>
+#include <haproxy/sink.h>
#include <haproxy/spoe.h>
#include <haproxy/stream.h>
#include <haproxy/stream_interface.h>
@@ -3021,6 +3022,7 @@
struct flt_conf *f;
struct spoe_config *conf = fconf->conf;
struct proxy *target;
+ struct logsrv *logsrv;
int i;
/* Check all SPOE filters for proxy <px> to be sure all SPOE agent names
@@ -3082,6 +3084,21 @@
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;