Hi, HAProxy 3.3.6 was released on 2026/03/19. It added 73 new commits after version 3.3.5. The most notable changes are in the HTTP/3 and HTTP/2 parsers, mixed with a serie of less important ones in the rest of the code.
HTTP/3 is responsible to check that the received payload size is equal to the content-length header if advertised. This prevents any risk of desynchronization with the backend side which could be exploited for request smuggling. This check is already performed most of the times, but it was missing when the stream was closed with an empty STREAM frame. This major flaw has been reported by Martino Spagnuolo. Thanks to him, a proper fix has been integrated with the necessary check now also performed when parsing empty frames. A CVE will be requested soon. Another issue in the HTTP/3 parser was the manipulation of unaligned non-DATA frames which resulted in undefined behavior. In practice, currently this condition never happens in a real-case scenario. As such, the safest solution is implemented for now with the connection immediately closed and glitch counter incremented. HTTP/2 and HTTP/3 parsers are also improved together to ensure any partial headers or trailers are properly removed on error from the HTX message. Also, the accounting for maximum trailers was not correct. An interoperability issue has been found in HTTP/2 multiplexer. The handling of GOAWAY and WINDOW_UPDATE is corrected to properly ignore the R bit when reading the stream ID as specified by the standard. This could have cause haproxy to ignore a received GOAWAY frame and continue to open new streams. This issue has been reported by Haruto Kimura and fixed thanks to him. Parser for the peers protocol is strengthened. Now received key type is always checked for conformity to prevent any risk of crash. In practice, as the peer protocol is only used in trusted network, the risk remains very low though. Thanks again to Haruto Kimura for having also found this one. SSL early data handling is adjusted so that is now works as expected with BoringSSL and AWS-LC libraries. Several minor fixes are related to the master process and the reload operation. The most important one is the correction of a file-descriptor leak present since 3.1 which can occur during the transfer of FDs via sockpair from a worker process to the master. Output of "show proc" command has also been fixed as some entries could have been missing. SPOE filter processing is now properly interrupted if a client abort occured due to abortonclose option. A bunch of changes concerns the "show profiling" utility. Notably, memory usage can now be displayed sorted by the calling context. Aggregate display mode is also supported for memory inspection. Finally, the CLI output of "show profiling" is no longer limited on a number of entries and it should consume less CPU when sorting a large number of them. Coredump loading is a procedure frequently performed by developers when debugging a crash. This is now easier with an utility to automatically find the post-mortem section in the coredump. It is also possible to include all loaded libraries in the dump itself with the option "set-dumpable libs". This should only be activated on developer request. Thanks to everyone who contributed to this release, ############################################################################################# 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.3/src/ Git repository : https://git.haproxy.org/git/haproxy-3.3.git/ Git Web browsing : https://git.haproxy.org/?p=haproxy-3.3.git Changelog : https://www.haproxy.org/download/3.3/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 (2): MINOR: mworker/cli: extract worker "show proc" row printer BUG/MINOR: mworker/cli: fix show proc pagination losing entries on resume Amaury Denoyelle (2): BUG/MAJOR: h3: check body size with content-length on empty FIN BUG/MEDIUM: h3: reject unaligned frames except DATA Christopher Faulet (10): BUG/MEDIUM: shctx: Use the next block when data exactly filled a block BUG/MINOR: spoe: Properly switch SPOE filter to WAITING_ACK state BUG/MEDIUM: spoe: Properly abort processing on client abort BUG/MINOR: h2/h3: Only test number of trailers inserted in HTX message MINOR: htx: Add function to truncate all blocks after a specific block BUG/MINOR: h2/h3: Never insert partial headers/trailers in an HTX message BUG/MINOR: http-ana: Swap L7 buffer with request buffer by hand BUG/MINOR: stream: Fix crash in stream dump if the current rule has no keyword BUG/MINOR: spoe: Fix condition to abort processing on client abort BUILD: spoe: Remove unsused variable Egor Shestakov (1): DOC/CLEANUP: config: update mentions of the old "Global parameters" section Mia Kanashi (1): BUG/MINOR: jws: fix memory leak in jws_b64_signature Olivier Houchard (2): BUG/MEDIUM: ssl: Handle receiving early data with BoringSSL/AWS-LC BUG/MEDIUM: ssl: Don't report read data as early data with AWS-LC Tim Duesterhus (1): BUG/MINOR: tcpcheck: Fix typo in error error message for `http-check expect` Tom Braarup (1): DOC: configuration: http-check expect example typo William Lallemand (10): BUG/MINOR: mworker: don't set the PROC_O_LEAVING flag on master process BUG/MINOR: mworker: always stop the receiving listener BUG/MINOR: mworker: only match worker processes when looking for unspawned proc BUG/MINOR: mworker: fix typo &= instead of & in proc list serialization BUG/MINOR: mworker: set a timeout on the worker socketpair read at startup BUG/MINOR: mworker: avoid passing NULL version in proc list serialization BUG/MINOR: sockpair: set FD_CLOEXEC on fd received via SCM_RIGHTS BUG/MINOR: mjson: make mystrtod() length-aware to prevent out-of-bounds reads BUG/MINOR: mworker: don't try to access an initializing process CI: github: treat vX.Y.Z release tags as stable like haproxy-* branches Willy Tarreau (43): BUG/MINOR: memprof: avoid a small memory leak in "show profiling" MINOR: activity: use dynamic allocation for "show profiling" entries MINOR: tools: extend the pointer hashing code to ease manipulations MINOR: memprof: attempt different retry slots for different hashes on collision BUG/MINOR: proxy: do not forget to validate quic-initial rules DEV: gdb: add a utility to find the post-mortem address from a core MINOR: tools: add a function to create a tar file header MINOR: tools: add a function to load a file into a tar archive MINOR: config: support explicit "on" and "off" for "set-dumpable" MINOR: debug: read all libs in memory when set-dumpable=libs DEV: gdb: add a new utility to extract libs from a core dump: libs-from-core MINOR: debug: copy debug symbols from /usr/lib/debug when present MINOR: debug: opportunistically load libthread_db.so.1 with set-dumpable=libs BUILD: makefile: fix range build without test command MINOR: tools: add a new pointer hash function that also takes an argument MINOR: tinfo: start to add basic thread_exec_ctx MINOR: memprof: prepare to consider exec_ctx in reporting MINOR: memprof: also permit to sort output by calling context MINOR: tools: add a function to write a thread execution context. MINOR: debug: report the execution context on thread dumps MINOR: memprof: report the execution context on profiling output MINOR: initcall: record the file and line declaration of an INITCALL MINOR: tools: decode execution context TH_EX_CTX_INITCALL MINOR: tools: support decoding ha_caller type exec context MINOR: sample: store location for fetch/conv via initcalls MINOR: sample: also report contexts registered directly MINOR: tools: support an execution context that is just a function MINOR: actions: store the location of keywords registered via initcalls MINOR: actions: also report execution contexts registered directly MINOR: filters: set the exec context to the current filter config MINOR: ssl: set the thread execution context during message callbacks MINOR: connection: track mux calls to report their allocation context MINOR: task: set execution context on task/tasklet calls MINOR: applet: set execution context on applet calls MINOR: cli: keep the info of the current keyword being processed in the appctx MINOR: cli: keep track of the initcall context since kw registration MINOR: cli: implement execution context for manually registered keywords MINOR: activity: support aggregating by caller also for memprofile MINOR: activity: raise the default number of memprofile buckets to 4k DOC: internals: short explanation on how thread_exec_ctx works BUG/MEDIUM: peers: enforce check on incoming table key type BUG/MINOR: mux-h2: properly ignore R bit in GOAWAY stream ID BUG/MINOR: mux-h2: properly ignore R bit in WINDOW_UPDATE increments --- -- Amaury Denoyelle

