Hi, HAProxy 2.8.17 was released on 2025/12/19. It added 71 new commits after version 2.8.16.
It is the last release of the series for this week. The list above was extracted from 3.0.11 and 3.0.12 announces: - An old bug were revealed about synchronous write events than could be missed during the data processing. This issue could lead to freeze a session until the next I/O event or a timeout expiration. The issue was fixed but it remains a bit sensitive. - 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! - An issue was fixed about stick-tables. The refcount of an entry can become inconsistent and prevent the entry from ever expiring if a local and remote update happen at the exact same time and the local entry is created at the moment the peers code releases the lock. On some rare occasions, stick-table keys of type strings could sometimes be incorrectly indexed with some extra bytes past the final zero and appear as duplicates, causing entries to get mixed. This is one of the longest living bugs we've had, it's been there since the feature was implemented in 1.4-dev7 almost 16 years ago! - 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). - Updating a CA from the CLI could occasionally cause a crash due to objects being still referenced. - Default HTTP 405, 431 and 501 error files had an incorrect content length that would probably cause the front connections to be closed after the response. - A crash that could occur after HTTP/2 upgrades from HTTP/1.1 has been resolved. The issue stemmed from the mux not being able to report that it had only released its structure and not the whole connection, causing the SSL tasklet to never be freed while being returned as running, thus causing an infinite loop. - A failure to allocate a new QUIC Connection ID during a RETIRE_CONNECTION_ID frame was silently ignored, potentially leaving the peer without valid IDs and causing connection failures. Now, such allocation errors are treated as fatal, closing the connection promptly, which is safer when memory pressure is high and prevents silent degradation of connectivity. Related to SSL 0-RTT, the header "Early-data: 1" is now added on requests handled by haproxy as QUIC 0-RTT if the handshake is not yet completed. This is helpful to inform servers that such request should be processed carefully. An internal change during stream notification mechanism is introduced which is transparent to most users, however if you ever encountered frozen transfers it could be a solution for this. Few issues in the CRYPTO frames parsing were fixed. QUIC listeners on FreeBSD were not functional if bound on a specific address. And, minimum and maximum limits enforced on the congestion window were not always respected. Both issues were fixed too. - 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. - The value of "tune.maxpollevents" could lead to an integer overflow when calculating the size to be allocated, resulting in a failure that would cause the poller to process no events at all (in practice the process is totally unresponsive). The value is now capped to 1 million, which is 4000 times higher than the default (250) and already does not make much sense, it should not need to be touched again for the next century. - An old bug form 2012 was fixed about the HTTP TUNNEL handling that causing tunnelled streams closed by the server to be closed on both sides at once and logging an error. And the timer used for "wait-for-body" action was not properly reset, causing some trouble with some following actions, like "pause". - Several OOM checks was added here and there by Alexander Stephan. - On the LUA side, read and write events are now properly notified when using the socket class to avoid infinite wait when the write side has been blocked earlier. - The tasks used to manage resolvers and the ones used to deal with communications with these resolvers are now single-threaded. These tasks were found to cause a lot of contention in the scheduler on high CPU count machines, for no added value. The rest is pretty minor, small fixes here and there and doc updates. 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 Q&A from devs : https://github.com/orgs/haproxy/discussions Sources : https://www.haproxy.org/download/2.8/src/ Git repository : https://git.haproxy.org/git/haproxy-2.8.git/ Git Web browsing : https://git.haproxy.org/?p=haproxy-2.8.git Changelog : https://www.haproxy.org/download/2.8/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 : Alexander Stephan (5): BUG/MINOR: halog: Add OOM checks for calloc() in filter_count_srv_status() and filter_count_url() BUG/MINOR: log: Add OOM checks for calloc() and malloc() in logformat parser and dup_logger() BUG/MINOR: cfgparse: Add OOM check for calloc() in cfg_parse_listen() BUG/MINOR: compression: Add OOM check for calloc() in parse_compression_options() BUG/MINOR: tools: Add OOM check for malloc() in indent_msg() Amaury Denoyelle (24): MINOR: quic: rename min/max fields for congestion window algo BUG/MINOR: quic: ensure cwnd limits are always enforced BUG/MINOR: mux-quic/h3: properly handle too low peer fctl initial stream OPTIM: quic: improve slightly qc_snd_buf() internal MINOR: quic: move IP_PKTINFO on send on a dedicated function BUG/MEDIUM: h3: do not overwrite interim with final response BUG/MINOR mux-quic: apply correctly timeout on output pending data BUG/MINOR: quic: check applet_putchk() for 'show quic' first line BUG/MEDIUM: h3: properly encode response after interim one in same buf MINOR: qmux: change API for snd_buf FIN transmission BUG/MEDIUM: h3: handle interim response properly on FE side BUG/MINOR: quic: close connection on CID alloc failure 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 MINOR: mux-quic: refactor wait-for-handshake support BUG/MEDIUM: mux-quic: ensure Early-data header is set BUG/MINOR: mux-quic: ensure close-spread-time is properly applied BUG/MEDIUM: mux-quic: adjust wakeup behavior Aurelien DARRAGON (3): BUG/MINOR: sink: retry attempt for sft server may never occur BUG/MINOR: log: fix potential memory leak upon error in add_to_logformat_list() BUG/MINOR: cfgparse-listen: update err_code for fatal error on proxy directive Christopher Faulet (6): BUG/MINOr: hlua: Fix receive from HTTP applet by properly accounting data BUG/MAJOR: stream: Force channel analysis on successful synchronous send BUG/MINOR: config: Limit "tune.maxpollevents" parameter to 1000000 BUG/MEDIUM: stick-tables: Always return the good stksess from stktable_set_entry BUG/MINOR: http-ana: Reset analyse_exp date after 'wait-for-body' action BUG/MEDIUM: http-ana: Don't close server connection on read0 in TUNNEL mode Frederic Lecaille (8): BUG/MINOR: quic: reorder fragmented RX CRYPTO frames by their offsets MINOR: quic: remove ->offset qf_crypto struct field CLEANUP: quic: remove a useless CRYPTO frame variable assignment BUG/MEDIUM: quic: CRYPTO frame freeing without eb_delete() BUG/MINOR: quic: ignore AGAIN ncbuf err when parsing CRYPTO frames BUG/MINOR: quic: Missing SSL session object freeing BUG/MINOR: quic: Wrong source address use on FreeBSD BUG/MINOR: quic: do not set first the default QUIC curves Huangbin Zhan (1): MINOR: http: fix 405,431,501 default errorfile Lukas Tribus (1): DOC: http: document 413 response code Olivier Houchard (3): BUG/MEDIUM: stick-tables: Don't forget to dec count on failure. MINOR: h1: h1_release() should return if it destroyed the connection BUG/MEDIUM: h1: prevent a crash on HTTP/2 upgrade Remi Tricot-Le Breton (4): BUG/MINOR: ssl: Free global_ssl structure contents during deinit BUG/MEDIUM: ssl: Crash because of dangling ckch_store reference in a ckch instance BUG/MINOR: init: Do not close previously created fd in stdio_quiet BUG/MINOR: jwt: Missing "case" in switch statement William Lallemand (6): BUILD: halog: misleading indentation in halog.c BUILD: ssl: can't build when using -DLISTEN_DEFAULT_CIPHERS BUG/MINOR: ssl: returns when SSL_CTX_new failed during init DOC: configuration: add missing ssllib_name_startswith() DOC: configuration: add missing openssl_version predicates BUG/MINOR: ssl: remove dead code in ssl_sock_from_buf() 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/MINOR: stick-tables: properly index string-type keys DOC: config: slightly clarify the ssl_fc_has_early() behavior BUG/MEDIUM: mux-h2: make sure not to move a dead connection to idle MEDIUM: dns: bind the nameserver sockets to the initiating thread MEDIUM: resolvers: make the process_resolvers() task single-threaded DOC: config: mention clearer that the cache's total-max-size is mandatory DOC: config: reorder the cache section's keywords -- Christopher Faulet

