Hi, HAProxy 3.2.7 was released on 2025/10/23. It added 48 new commits after version 3.2.6.
We've seen a number of issues accumulate in the maintenance branch, so it seems it was about time to produce a new release. I'll focus on the most important ones: - a missed initialization in QUIC could trigger a BUG_ON() hence provoke a crash in qc_rcv_buf(). - the way certain QUIC stacks recently started to send their crypto frames leaving a single byte hole between them was fundamentally incompatible with our storage model which requires at least 8 bytes holes. As such, some of them would experience random connection failures due to dropped frames. This required to rework that storage part (the "ncbuf" stuff) to support an alternate byte-addressed area that is compatible with this behavior that we initially considered as irrelevant and only likely used by attackers. This new work has been extensively tested in produciton where the issue was first reported, and given that there were some reports of recent Firefox versions triggering the issue, we considered that we should not wait to backport it. Thanks Annika for your wonderful help BTW! - as mentioned previously here, we've got a report of accidental breakage in 3.0 of the hash algorithms involved in consistent hashing, that prevents some users from migrating from pre-3.0 to 3.0+ by causing too heavy a cache redistribution. The problem is that fixing it will also cause some redistribution for those running on affected versions. The overall consensus was that those not noticing the issue will not be impacted by the fix and those impacted by it have not upgraded because of it, so better fix it in any case. In order to know if you're subject to this problem, look for "hash-type consistent" in your config, and if present, then check if there is a "hash-key" setting. If the first one is present without the second one or with "hash-key id", you may notice a drop in cache hit ratio during the upgrade. If the cache hit ratio is already small (e.g. small storage), it may be better to upgrade all LB nodes at once. If the cache hit ratio is very high (large storage), it might be better to first upgrade one LB node to pre-heat the caches with the redistributed objects, then upgrade the other ones. But based on what was observed since then, it should pass smoothly at most if not all places. - declaring thread groups with non-existing threads would cause some listeners to fail to accept pending connections, or even to crash when trying to dispatch incoming connections to the same group's threads. This was fixed by refining the groups to only work with existing threads. However, if a group ends up with no thread, now an error will be reported and the process will refuse to start (which is always better than starting and rejecting traffic like today). This only concerns those with manually configured "thread-groups" directives in their configs. - sending lots of short commands on the CLI (e.g. "add acl") very fast could trigger the spinning loop detection and abort the process. The loop detection has indeed lost accuracy during the 3.2 rework of the applets, and commands that only consume data without producing any were not properly diagnosed. - a memory leak that affects the CLI since the 3.2 rework was fixed. Every connection that sends a command and immediately quit with before the response would leak one buffer. It can happen when constantly adjusting some settings (e.g. script that frequently connects to change a server's weight). - a bug on the CLI can cause a crash on "show pools" followed by some filtering or sorting if the output shows less than 100 pools (most common builds due to pools merging). - we've got some reports of segfaults at boot with GCC 15 and tree vectorization being applied to unaligned data at -O3, only for certain very specific targets (westmere and nehalem only). An extra build option to calm down that optimization was added that got rid of the issue, and greeted us with the pleasant surprise of improving the -O3 request rate by about 5%. All optimizations are not always as effective as planned. - 1xx responses in HTTP/3 were not always properly encoded if they would appear in the same response packet as the final response, and they would generally cause a parsing error on the client, which will abort the connection; 1xx sent along the final response are really not common right now and mostly happen in testing, but some applications could trigger them more than others. - a slow memory leak of SSL captures has been noticed over the last two years on haproxy.org, making us believe that it was in the SSL lib, because the counters we placed around it showed more calls to the init() callback than the release() one. We were actually wrong and discovered that in TLS 1.3 there can be two consecutive Client Hello messages on a connection and that this caused the capture area to be allocated twice and only the last one was freed. At least it explained everything, and this was fixed (and confirms to no longer leak). - a ring that would fail to connect to one of its servers could remain stuck forever if unlucky and it happens at a precise ms within the 20 first seconds of boot (then every 49.7 days). - a bug in mt_list_delete() applied to an already deleted entry in the process of being re-added was detected in 3.3-dev where it would make a development branch constantly fail. The fact that it was never noticed before comforts us in the idea that the pattern doesn't exist in 3.2 or older. But we preferred to backport the fix in case it would become necessary in the future and we'd forget about it. In addition to this, the acme code was updated to match 3.3 (various fixes), there were a few extra QUIC and TLS fixes and cleanups, build fixes and a small fix on stick-tables usage counters that could be wrong in case of memory allocation failure. And that's roughly all. For the vast majority of users there's no emergency to update to this version. But it's also a good opportunity to include it in new deployments. I haven't checked precisely but I think that many of the issues above also concern 3.1 and 3.0 so it's likely that more releases will be emitted soon as time permits. 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 Q&A from devs : https://github.com/orgs/haproxy/discussions Sources : https://www.haproxy.org/download/3.2/src/ Git repository : https://git.haproxy.org/git/haproxy-3.2.git/ Git Web browsing : https://git.haproxy.org/?p=haproxy-3.2.git Changelog : https://www.haproxy.org/download/3.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 (11): MINOR: quic: restore QUIC_HP_SAMPLE_LEN constant BUG/MINOR: quic: check applet_putchk() for 'show quic' first line BUG/MEDIUM: h3: properly encode response after interim one in same buf MINOR: ncbuf: extract common types MINOR: ncbmbuf: define new ncbmbuf type MINOR: ncbmbuf: implement add MINOR: ncbmbuf: implement iterator bitmap utilities functions MINOR: ncbmbuf: implement ncbmb_data() MINOR: ncbmbuf: implement advance operation MINOR: ncbmbuf: add tests as standalone mode BUG/MAJOR: quic: use ncbmbuf for CRYPTO handling Aurelien DARRAGON (1): BUG/MINOR: sink: retry attempt for sft server may never occur Christopher Faulet (2): BUG/MINOr: hlua: Fix receive from HTTP applet by properly accounting data BUG/MEDIUM: apppet: Improve spinning loop detection with the new API Frederic Lecaille (4): TESTS: quic: useless param for b_quic_dec_int() BUG/MINOR: quic: too short PADDING frame for too short packets BUG/MINOR: quic: SSL counters not handled BUG/MAJOR: quic: uninitialized quic_conn_closed struct members Olivier Houchard (2): BUG/MEDIUM: stick-tables: Don't forget to dec count on failure. BUG/MEDIUM: mt_list: Make sure not to unlock the element twice Remi Tricot-Le Breton (3): BUG/MINOR: ssl: Free global_ssl structure contents during deinit BUG/MINOR: ssl: Free key_base from global_ssl structure during deinit BUG/MINOR: ssl: Potential NULL deref in trace macro Valentine Krasnobaeva (1): MINOR: debug: add distro name and version in postmortem William Lallemand (14): BUG/MINOR: acme: avoid overflow when diff > notAfter BUG/MINOR: ssl: leak in ssl-f-use BUG/MINOR: ssl: leak crtlist_name in ssl-f-use BUILD: ssl: can't build when using -DLISTEN_DEFAULT_CIPHERS MINOR: acme: acme-vars allow to pass data to the dpapi sink MINOR: acme: check acme-vars allocation during escaping CLEANUP: acme: acme_will_expire() uses acme_schedule_date() MINOR: acme: provider-name for dpapi sink BUILD: acme: fix false positive null pointer dereference MINOR: acme: implement "reuse-key" option MEDIUM: acme: don't insert acme account key in ckchs_tree BUG/MINOR: acme: memory leak from the config parser MINOR: acme: add the dns-01-record field to the sink MINOR: acme: display the complete challenge_ready command in the logs Willy Tarreau (10): BUG/MEDIUM: ssl: take care of second client hello BUG/MINOR: ssl: always clear the remains of the first hello for the second one BUILD: makefile: disable tail calls optimizations with memory profiling BUG/MEDIUM: pools: fix crash on filtered "show pools" output BUG/MINOR: pools: don't report "limited to the first X entries" by default BUG/MAJOR: lb-chash: fix key calculation when using default hash-key id DOC: clarify the experimental status for certain features BUG/MEDIUM: threads/config: drop absent threads from thread groups BUG/MEDIUM: cli: also free the trash chunk on the error path BUG/MEDIUM: build: limit excessive and counter-productive gcc-15 vectorization ---

