Hi, HAProxy 2.2.34 was released on 2025/04/23. It added 82 new commits after version 2.2.33. This version contains one year of fixes and will be the last one for branch 2.2 (as such it was marked EOL in haproxy -vv). I'm picking the relevant pieces of the changelog from 2.4.27/28/29. Nothing looks really important, as expected.
It tends to make modern compilers complain (that was already the case with 2.2.33). I've backported a few build fixes, but the CI still doesn't like it so I've run the tests manually. I could at least build it and test it on Linux (ubuntu 20/gcc-9 armv7/aarch64/x86_64, ubuntu 22/gcc-11 aarch64, slackware 15 x86_64), FreeBSD 13/clang x86_64 and OpenBSD 7.6/gcc-8 mips64. This version contains the following fixes: - one fix was applied for better HTTP error reporting. In some cases, 502 server initial errors were incorrectly hidden and are now properly logged. - on the backend side, an issue was found when NTLM headers are used. This caused the backend connection to be marked dynamically as private to prevent HTTP reuse. However, this is conceptually wrong when using HTTP/2 multiplexer on the backend side with http-reuse mode set to aggressive or higher, as this connection can already be shared accross several clients. Thus, NTLM headers are simply ignored in this case. - for the SSL stack, cipher algorithm negotiation was adjusted as haproxy could have chosen an ECDSA certificate even if not compatible with client algorithms instead of fallback to RSA. - a Solaris user reported that external checks were causing an infinite loop. In fact, this was due to a wrong signal handling in evports, Solaris polling mechanism, present since its first introduction in haproxy. - an issue in SPOE that can cause a thread to refrain from creating an applet to connect outside, causing failures on requests processed on this thread. - it was possible to crash the process when performing an implicit protocol upgrade (TCP to HTTP due to a transition from a TCP front to an HTTP back) if an error happened on the connection just before the transition. - description of the command line options -dR and -dV were missing in the management documentation. It is now fixed. Documentation about "show stat" CLI command was also updated to reflect the renaming of "dns" counters to "resolvers". In the configuration manual, the info about http-keep-alive timeout and other timeouts were improved. - The way to deal with too many headers in received H2. The maximum number of headers allowed in HEADERS frames on sending path was lower than on receiving path. This could lead to report sending errors while the message was accepted. It could be confusing. In addition, unlike H1, the number of headers must be limited when H2 messages are sent to comply to limitation imposed by the protocol. This limit was increased to support headers rewriting without issue. - On the H2 multiplexer, on server side, it was possible to send RST_STREAM frame for streams with unassigned ID, so before the formatting of the HEADERS frame, because the session was aborted during the connection stage. It was an issue if this happened before the H2 PREFACE was sent because this prevent the servers to recognize it as a H2 connection, leading to an early connection closure. We now take care to not emit RST_STREAM frame in that case. - The request state was not properly reset on L7 retry. The request channel flag stating some data were sent was not reset on retry. This could lead to consider a subsequent connection error as a L7 error while the request was never sent. In that case the request could be lost, leading to crash. - The SIGINT signal could be missed by HAProxy when it was started in background in a subshell. It is the root cause of some unexpected timeouts with Vtest scripts. To fix the issue, the default signal handler is registered for the SIGINT signal during init. - an API issue in the applets could have resulted in some shutdown or error conditions to be missed in the future, so as a prevention it was fixed. Turns out, after fixing this, it uncovered a bug in the CLI's "_getsocks" handler that was causing an infinite loop during reloads, and another one in the SPOE applet where the appled would never shut down (neither appeared in a released version), and these bug were also fixed. - a BUG_ON() could be triggered when using filters with no http_payload callback. - a bug in htx_xfer_blks() could result in occasionally transfering more blocks than requested on 32-bit platforms. - some TLSv1.3 signature algorithms were not recognized by the ClientHello parser which was written before TLSv1.3. The ones that were not correctly supported were based on RSA-PSS and would have resulted in presenting a possibly wrong certificate when both RSA and ECDSA ones were present for the same SNI. - a use-after-free condition was occasionally possible in Lua applets handling CLI keywords, causing random crashes. It was apparently difficult to trigger and did apparently not happen before 3.0. - leading and trailing spaces are now properly trimmed from h2 header values. It had been observed that some rare clients keep the space after the comma when splitting "cookie" values, causing errors between haproxy and servers. - stick-tables could learn entries from peers with an expiration date further in the future than what their own expire time permits, causing entries resulting from a temporary misconfiguration to be very difficult to evict from a cluster (e.g. mistakenly write "24d" instead of "24h" and entries persist for 3 weeks even across reloads). Now the entries' expiration date will be capped to the stick table's setting. - the regsub converter, used to perform regex-based substitutions, would check the remaining room in the buffer against the initially available size for each replaced pattern instead of checking it against the remaining size. This was reported by Aleandro Prudenzano of Doyensec and Edoardo Geraci of Codean Labs, and was assigned CVE-2025-32464. The risk is quite low since such configs are quite unlikely and in the rare cases they will happen, the replacement will involve static contents, thus essentially a risk of crash. - a few issues on the peers section parser and config consistency checker possibly causing issues or even a segfault. - FCGI would always force the status to 302 when seeing a Location header, possibly overwriting another status code. - a few doc/ci/build updates A number of lower importance fixes were just not backported from 2.4 as not worth the effort and/or needlessly risky. Let me insist again that this version now reached end of life, so in theory it should not be deployed, or only as a temporary solution to help with a transition to a newer one. If you're still on 2.2 and don't know what version to choose, first, skip 2.4 which dies next year. If you want something super stable, 2.6 is a good one. For more responsiveness from developers and the community in general, better pick 3.0 or above. Note that counter-intuitively, the reliabilty of 3.x could actually surpass that of older versions thanks to a cleaner architecture and better troubleshooting tools in general. Now's time to say good bye to 2.2. 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/2.2/src/ Git repository : https://git.haproxy.org/git/haproxy-2.2.git/ Git Web browsing : https://git.haproxy.org/?p=haproxy-2.2.git Changelog : https://www.haproxy.org/download/2.2/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 Willy --- Complete changelog : Amaury Denoyelle (2): BUG/MEDIUM: http_ana: ignore NTLM for reuse aggressive/always and no H1 SCRIPTS: git-show-backports: do not truncate git-show output Aurelien DARRAGON (10): BUG/MINOR: log: fix lf_text_len() truncate inconsistency BUG/MINOR: tools/log: invalid encode_{chunk,string} usage BUG/MINOR: log: invalid snprintf() usage in sess_build_logline() BUG/MEDIUM: fd: prevent memory waste in fdtab array CLEANUP: hlua: use hlua_pusherror() where relevant DOC: management: rename show stats domain cli "dns" to "resolvers" BUG/MINOR: hlua: report proper context upon error in hlua_cli_io_handler_fct() DOC: lua: fix yield-dependent methods expected contexts BUG/MINOR: stktable: fix big-endian compatiblity in smp_to_stkey() BUG/MEDIUM: hlua/cli: fix cli applet UAF in hlua_applet_wakeup() Bertrand Jacquin (1): MINOR: build: force CC to set a return code when probing options Christopher Faulet (25): BUG/MEDIUM: http-ana: Deliver 502 on keep-alive for fressh server connection BUG/MEDIUM: stconn: Don't forward channel data if input data must be filtered BUG/MINOR: htpp-ana/stats: Specify that HTX redirect messages have a C-L header BUG/MINOR: stats: Don't state the 303 redirect response is chunked BUG/MEDIUM: spoe: Be sure to create a SPOE applet if none on the current thread BUG/MINOR: cli: Atomically inc the global request counter between CLI commands BUG/MEDIUM: stream: Prevent mux upgrades if client connection is no longer ready BUG/MEDIUM: cli: Always release back endpoint between two commands on the mcli BUG/MINOR: server: Don't warn fallback IP is used during init-addr resolution BUG/MEDIUM: mux-h2: Don't send RST_STREAM frame for streams with no ID BUG/MINOR: http_ana: Report -1 for %Tr for invalid response only DOC: config: Slightly improve the %Tr documentation BUG/MEDIUM: mux-h2: Increase max number of headers when encoding HEADERS frames BUG/MEDIUM: mux-h2: Check the number of headers in HEADERS frame after decoding BUG/MEDIUM: http-ana: Reset request flag about data sent to perform a L7 retry BUG/MINOR: h1-htx: Use default reason if not set when formatting the response BUG/MINOR: spoe: Check the shared waiting queue to shut applets during stopping BUG/MINOR: spoe: Allow applet creation when closing the last one during stopping REGTESTS: Fix truncated.vtc to send 0-CRLF BUG/MINOR: cli: Wait for the last ACK when FDs are xferred from the old worker BUG/MEDIUM: filters: Handle filters registered on data with no payload callback BUG/MINOR: fcgi: Don't set the status to 302 if it is already set BUG/MINOR: cli: Fix a possible infinite loop in _getsocks() BUG/MINOR: stats-json: Define JSON_INT_MAX as a signed integer BUILD: makefile: Redirect stderr to /dev/null when probing options Emeric Brun (2): BUG/MINOR: peers: fix expire learned from a peer not converted from ms to ticks BUG/MEDIUM: peers: prevent learning expiration too far in futur from unsync node Ilia Shipitsin (2): BUG/MINOR: fcgi-app: handle a possible strdup() failure BUG/MINOR: namespace: handle a possible strdup() failure Ilya Shipitsin (1): CI: introduce scripts/build-vtest.sh for installing VTest Lukas Tribus (1): DOC: option redispatch should mention persist options Valentine Krasnobaeva (8): BUG/MINOR: ssl/ocsp: init callback func ptr as NULL BUG/MINOR: haproxy: only tid 0 must not sleep if got signal DOC/MINOR: management: add missed -dR and -dv options BUG/MINOR: cfgparse-global: fix allowed args number for setenv BUG/MINOR: mworker: fix mworker-max-reloads parser BUG/MINOR: signal: register default handler for SIGINT in signal_init() BUG/MINOR: ssl: put ssl_sock_load_ca under SSL_NO_GENERATE_CERTIFICATES BUG/MINOR: cfgparse: fix NULL ptr dereference in cfg_parse_peers William Lallemand (8): DOC: configuration: clarify ciphersuites usage DOC: configuration: clarify ciphersuites usage (V2) BUG/MEDIUM: ssl: wrong priority whem limiting ECDSA ciphers in ECDSA+RSA configuration DOC: configuration: fix alphabetical order of bind options BUG/MINOR: ssl: can't load a separated key file with openssl > 3.0 BUG/MEDIUM: ssl: chosing correct certificate using RSA-PSS with TLSv1.3 BUG/MEDIUM: htx: wrong count computation in htx_xfer_blks() TESTS: ist: fix wrong array size Willy Tarreau (22): BUG/MEDIUM: connection: report connection errors even when no mux is installed BUG/MEDIUM: evports: do not clear returned events list on signal BUG/MINOR: fd: my_closefrom() on Linux could skip contiguous series of sockets BUG/MINOR: h1: fix detection of upper bytes in the URI BUG/MEDIUM: htx: mark htx_sl as packed since it may be realigned BUILD: fd: errno is also needed without poll() BUG/MINOR: tcpcheck: report correct error in tcp-check rule parser BUG/MINOR: tools: fix possible null-deref in env_expand() on out-of-memory BUG/MINOR: cfgparse: remove the correct option on httpcheck send-state warning CI: scripts: fix build of vtest regarding option -C BUG/MINOR: trace: automatically start in waiting mode with "start <evt>" REGTESTS: fix random failures with wrong_ip_port_logging.vtc under load BUG/MINOR: polling: fix time reporting when using busy polling DOC: config: improve the http-keep-alive section BUG/MEDIUM: checks: make sure to always apply offsets to now_ms in expiration BUG/MINOR: peers: make sure to always apply offsets to now_ms in expiration MINOR: cli: export cli_io_handler() to ease symbol resolution BUG/MEDIUM: sample: fix risk of overflow when replacing multiple regex back-refs BUILD: makefile: silence deprecated declarations when using OpenSSL MINOR: version: set the EOL for the 2.2 branch BUILD: config: fix again bugs gcc warnings on calloc [try 2] BUG/MINOR: h2: always trim leading and trailing LWS in header values ---