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
---