Files
Alexandru Ardelean 927fc5ea54 fluent-bit: fix HTTP output SIGSEGV on too-small coroutine stack
Each output flush runs in a coroutine whose stack was forced to 4096 (one
page). The HTTP output plugin overflows it and crashes with SIGSEGV after
the flush (issue #30113). Pin FLB_CORO_STACK_SIZE to upstream's own 64K
floor (FLB_CORO_STACK_SIZE_MIN_BYTE), which the musl-shrunk default undercuts.

Also add a regression test: drive the dummy input into the http output and
assert fluent-bit survives a few flush cycles instead of dying from a signal
(no listener needed -- the overflow happens while composing the request).

Fixes: https://github.com/openwrt/packages/issues/30113
Signed-off-by: Alexandru Ardelean <alex@shruggie.ro>
2026-08-01 21:19:47 +03:00

47 lines
1.3 KiB
Bash
Executable File

#!/bin/sh
# Regression test for issue #30113: with too small a coroutine stack the HTTP
# output plugin overflows and dies (SIGSEGV/abort) on its first flush. Drive the
# dummy input into the http output and make sure fluent-bit survives a few flush
# cycles. No server is needed -- the crash happens while composing/sending the
# request, so a refused local port is enough to exercise it.
case "$1" in
fluent-bit) ;;
*) exit 0 ;;
esac
BIN=/usr/sbin/fluent-bit
[ -x "$BIN" ] || { echo "FAIL: $BIN not installed"; exit 1; }
cfg=/tmp/fluent-bit-http.conf
cat > "$cfg" <<'EOF'
[SERVICE]
flush 1
daemon off
log_level error
[INPUT]
name dummy
dummy {"message":"regress-30113"}
rate 100
[OUTPUT]
name http
match *
host 127.0.0.1
port 5170
format json
EOF
# A healthy run keeps retrying the refused endpoint until timeout stops it
# (rc 124); a coroutine-stack overflow dies from a signal (rc >= 128) within
# the first flush cycle.
timeout 6 "$BIN" -c "$cfg" >/tmp/fluent-bit-http.out 2>&1
rc=$?
if [ "$rc" -ge 128 ]; then
echo "FAIL: fluent-bit http output died from a signal (rc=$rc) -- coro stack too small"
grep -iE 'signal|SIGSEGV' /tmp/fluent-bit-http.out | head -1
exit 1
fi
echo "fluent-bit: http output survived flush cycles (rc=$rc)"