mirror of https://github.com/openwrt/packages.git
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>pull/30135/head
parent
aad6a5a68c
commit
927fc5ea54
|
|
@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
|
|||
|
||||
PKG_NAME:=fluent-bit
|
||||
PKG_VERSION:=5.0.8
|
||||
PKG_RELEASE:=2
|
||||
PKG_RELEASE:=3
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://github.com/fluent/fluent-bit.git
|
||||
|
|
@ -47,7 +47,7 @@ CMAKE_OPTIONS+= \
|
|||
-DFLB_BACKTRACE=No \
|
||||
-DFLB_WASM=No \
|
||||
-DFLB_LUAJIT=No \
|
||||
-DFLB_CORO_STACK_SIZE=4096 \
|
||||
-DFLB_CORO_STACK_SIZE=65536 \
|
||||
-DWITH_SASL=No \
|
||||
-DWITH_ZLIB=No \
|
||||
-DWITH_ZSTD=No \
|
||||
|
|
|
|||
|
|
@ -0,0 +1,46 @@
|
|||
#!/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)"
|
||||
Loading…
Reference in New Issue