Hi, HAProxy 3.0.11 was released on 2025/06/02. It added 48 new commits after version 3.0.10.
This release is smaller than the 3.1.7 but it though is quite similar. Here is the list of issues fixed: * In the cache, when reference counter was added on cache entries, a regression was introduced that could lead to crash the process. When too many secondary entries were found in the cache for a given key, the wrong entry was released, corrupting the cache tree. To hit the bug, the processing of the "Vary" header must be enabled. The 3.0 is also affected by this bug. * Since we made it possible for a bind_conf to listen to multiple thread groups with shards in 2.8, the per-listener connection count was not properly transferred to the target listener with the connection when switching to another thread group. This resulted in one listener possibly reaching high values and another one possibly reaching negative values. Usually it was not visible, unless a maxconn was set on the bind_conf, in which case comparisons would quickly put an end to the willingness to accept new connections. This problem only happened when thread groups were enabled. * In Lua, the detection of shutdowns for TCP applets based on the new API was not properly handled. The applet could hang, waiting for more data, instead of leaving. Concretely, this bug can only be hit by lua CLI commands. In addition, AppletTCP:getline() function was fixed to be able to handle the new applet API. Using it from a lua CLI command would lead to unexpected behaviour. Finally, Channel:data() and Channel:line() functions was fixed to respect the documentation. * On peers, segfaults could be experienced because of a tiny race condition where a stick-table entry was removed while its expiration timer was updated. * A crash could be experienced if a server was inserted via the "add server" command with an already existing GUID. * The 0-copy data forwarding was not disabled for filters altering the data. It could be an issue if the filter did not remain attached on the stream. Concretely, it could only be an issue for some LUA filters. * On QUIC, wrong error codes were used to missing or invalid transport parameters. Some others were not rejected. * On H3, multiple Host headers were still preserved, only the values were compared. We are now aligned with the h1 and h2 by dropping extraneous headers. Information about :scheme pseudo-header were not properly reported at the HTX level, preventing the H2 multiplexer to preserve it on server side. * On the CLI, no error was reported when too many arguments were passed for a command. Instead, arguments above the limit (64 by default) were just silently ignored. * On the DNS part, an unexpected CPU usage could be experienced because there was no delay on connection retries. It was observed with a nameserver with invalid network settings. There is now a one-second delay between two connections. Related to this issue, it was also possible to have an accumulation of DNS sessions. The number of DNS sessions is now tracked When we reach a threshold (set to 100), we consider that the link to the dns server is broken (at least temporarily) and we stop creating new sessions until one of the existing one eventually succeeds. * On SSL, the crt-store keywords parsing was improved to avoid leak during configuration parsing when several occurrences of the same keyword were found. * The soft-stop was broken since a while when the thread support was disabled. * The detection of the Rx buffer full condition on the FCGI mux could trigger too early, causing the CPU to bounce between recv and demux until the timeout expires. * The automatic maxconn value was not calculated correctly for certain large values of the memmax value passed with "-m" on the command line, and was falling back to the default 100 used for the master process, which is extremely low. The limit before it started to misbehave was around 15-20 GB depending on the setups. * On h2, streams are now reset with NO_ERROR and not CANCEL when the server responds before the end of the request and closes, making it clear to the client that the response is valid and not an error. About improvements backported to 3.0.11: * "send-proxy" and "send-proxy-v2" options are not relevant nor supported on a ring server. It is now explicitly ignored and a warning is emitted. * The API for the lua HTTPMessage "class" was improved to be able to change the body length. It was mandatory to be able to write a lua filter altering the message payload. HTTPMessage:set_body_len() can now be used for this purpose. * Still in lua, The HTTP client is not supposed to be used to process several requests but there was nothing to prevent this usage. An error is now triggered in that case and the lua documentation was updated to be clear on this point. * The CI now relies on vtest2 which finally contains the fixes we were relying on and which is going to evolve. * Backtraces are now enabled by default on libmusl, we found why they were not working. This means that reports from crashes inside Docker images should be more useful now. Thanks everyone for your help ! Please find the usual URLs below : Site index : https://www.haproxy.org/ Documentation : https://docs.haproxy.org/ Wiki : https://github.com/haproxy/wiki/wiki Discourse : https://discourse.haproxy.org/ Slack channel : https://slack.haproxy.org/ Issue tracker : https://github.com/haproxy/haproxy/issues Sources : https://www.haproxy.org/download/3.0/src/ Git repository : https://git.haproxy.org/git/haproxy-3.0.git/ Git Web browsing : https://git.haproxy.org/?p=haproxy-3.0.git Changelog : https://www.haproxy.org/download/3.0/src/CHANGELOG Dataplane API : https://github.com/haproxytech/dataplaneapi/releases/latest Pending bugs : https://www.haproxy.org/l/pending-bugs Reviewed bugs : https://www.haproxy.org/l/reviewed-bugs Code reports : https://www.haproxy.org/l/code-reports Latest builds : https://www.haproxy.org/l/dev-packages --- Complete changelog : Amaury Denoyelle (8): MINOR: quic: extend return value during TP parsing BUG/MINOR: quic: use proper error code on missing CID in TPs BUG/MINOR: quic: use proper error code on invalid server TP BUG/MINOR: quic: reject retry_source_cid TP on server side BUG/MINOR: quic: use proper error code on invalid received TP value BUG/MINOR: quic: fix TP reject on invalid max-ack-delay BUG/MINOR: quic: reject invalid max_udp_payload size BUG/MEDIUM: server: fix crash after duplicate GUID insertion Aurelien DARRAGON (9): MINOR: applet: add appctx_schedule() macro BUG/MINOR: dns: add tempo between 2 connection attempts for dns servers CLEANUP: dns: remove unused dns_stream_server struct member BUG/MINOR: dns: prevent ds accumulation within dss BUG/MINOR: proxy: only use proxy_inc_fe_cum_sess_ver_ctr() with frontends BUG/MINOR: cli: fix too many args detection for commands BUG/MINOR: threads: fix soft-stop without multithreading support BUG/MINOR: sink: detect and warn when using "send-proxy" options with ring servers DOC: config: restore default values for resolvers hold directive Christopher Faulet (17): BUG/MEDIUM: mux-fcgi: Try to fully fill demux buffer on receive if not empty BUG/MINOR: cli: Issue an error when too many args are passed for a command BUG/MINOR: mux-h1: Don't pretend connection was released for TCP>H1>H2 upgrade BUG/MINOR: mux-h1: Fix trace message in h1_detroy() to not relay on connection BUG/MINOR: hlua: Fix Channel:data() and Channel:line() to respect documentation MEDIUM: hlua: Add function to change the body length of an HTTP Message BUG/MEDIUM: stconn: Disable 0-copy forwarding for filters altering the payload BUG/MINOR: mux-h2: Reset streams with NO_ERROR code if full response was already sent BUG/MINOR: h3: Set HTX flags corresponding to the scheme found in the request BUG/MEDIUM: hlua: Properly detect shudowns for TCP applets based on the new API BUG/MEDIUM: hlua: Fix getline() for TCP applets to work with applet's buffers REGTESTS: Make the script testing conditional set-var compatible with Vtest2 REGTESTS: Explicitly allow failing shell commands in some scripts CI: vtest: Rely on VTest2 to run regression tests CI: vtest: Fix the build script to properly work on MaOS BUG/MEDIUM: httpclient: Throw an error if an lua httpclient instance is reused DOC: hlua: Add a note to warn user about httpclient object reuse Frederic Lecaille (2): CLEANUP: quic: Useless BIO_METHOD initialization MINOR: quic: Add useful error traces about qc_ssl_sess_init() failures Lukas Tribus (1): DOC: ring: refer to newer RFC5424 Remi Tricot-Le Breton (1): BUG/MAJOR: cache: Crash because of wrong cache entry deleted Valentine Krasnobaeva (1): BUG/MINOR: limits: compute_ideal_maxconn: don't cap remain if fd_hard_limit=0 William Lallemand (2): BUG/MINOR: ssl/ckch: always free() the previous entry during parsing DOC: configuration: fix the example in crt-store Willy Tarreau (7): BUG/MAJOR: listeners: transfer connection accounting when switching listeners BUG/MEDIUM: peers: hold the refcnt until updating ts->seen DOC: config: recommend disabling libc-based resolution with resolvers BUG/MINOR: h3: don't insert more than one Host header BUILD: makefile: enable backtrace by default on musl BUG/MEDIUM: server: fix potential null-deref after previous fix DOC: hlua: fix a few typos in HTTPMessage.set_body_len() documentation -- Christopher Faulet