]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: spoe: Resolve the sink if a SPOE logs in a ring buffer
authorChristopher Faulet <cfaulet@haproxy.com>
Fri, 19 Feb 2021 09:56:41 +0000 (10:56 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Fri, 19 Feb 2021 17:03:59 +0000 (18:03 +0100)
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.

src/flt_spoe.c

index bfd6f4fbfb71fea81c0e4b1a4ed8235a015ed94c..b9471d9170775abf10858d712a5ea87af5c81954 100644 (file)
@@ -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 @@ 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 <px> 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;