From baf22733453a63155341a0a3cd0af706efce0734 Mon Sep 17 00:00:00 2001 From: William Dauchy Date: Thu, 25 Feb 2021 00:53:13 +0100 Subject: [PATCH] BUG/MEDIUM: contrib/prometheus-exporter: fix segfault in listener name dump MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We need to check whether listener is empty before doing anything; in that case, we were trying to dump listerner name while name is null. So simply move the counters check above, which validate all possible cases when the listener is empty. This is very similar to what is done in stats.c see also the trace: Thread 1 "haproxy" received signal SIGSEGV, Segmentation fault. __strlen_sse2 () at ../sysdeps/x86_64/multiarch/../strlen.S:120 120     ../sysdeps/x86_64/multiarch/../strlen.S: No such file or directory. (gdb) bt #0  __strlen_sse2 () at ../sysdeps/x86_64/multiarch/../strlen.S:120 #1  0x00005555555b716b in promex_dump_listener_metrics (htx=0x5555558fadf0, appctx=0x555555926070) at contrib/prometheus-exporter/service-prometheus.c:722 #2  promex_dump_metrics (htx=0x5555558fadf0, si=0x555555925920, appctx=0x555555926070) at contrib/prometheus-exporter/service-prometheus.c:1200 #3  promex_appctx_handle_io (appctx=0x555555926070) at contrib/prometheus-exporter/service-prometheus.c:1477 #4  0x00005555556f0c94 in task_run_applet (t=0x555555926180, context=0x555555926070, state=) at src/applet.c:88 #5  0x00005555556bc6d8 in run_tasks_from_lists (budgets=budgets@entry=0x7fffffffe374) at src/task.c:548 #6  0x00005555556bd1a0 in process_runnable_tasks () at src/task.c:750 #7  0x0000555555696cdd in run_poll_loop () at src/haproxy.c:2870 #8  0x0000555555697025 in run_thread_poll_loop (data=data@entry=0x0) at src/haproxy.c:3035 #9  0x0000555555596c90 in main (argc=, argv=0x7fffffffe818) at src/haproxy.c:3723 quit) this bug was introduced by commit e3f7bd5ae9e969cbfe87e4130d06bff7a3e814c6 ("MEDIUM: contrib/prometheus-exporter: add listen stats"), which is present for 2.4 only, so no backport needed. Signed-off-by: William Dauchy --- contrib/prometheus-exporter/service-prometheus.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contrib/prometheus-exporter/service-prometheus.c b/contrib/prometheus-exporter/service-prometheus.c index 7cf30c1f3..e6023d353 100644 --- a/contrib/prometheus-exporter/service-prometheus.c +++ b/contrib/prometheus-exporter/service-prometheus.c @@ -718,12 +718,12 @@ static int promex_dump_listener_metrics(struct appctx *appctx, struct htx *htx) li = appctx->ctx.stats.obj2; list_for_each_entry_from(li, &px->conf.listeners, by_fe) { - labels[1].name = ist("listener"); - labels[1].value = ist2(li->name, strlen(li->name)); - if (!li->counters) continue; + labels[1].name = ist("listener"); + labels[1].value = ist2(li->name, strlen(li->name)); + if (!stats_fill_li_stats(px, li, 0, stats, ST_F_TOTAL_FIELDS, &(appctx->st2))) return -1;